设计模式(三十一)------23种设计模式(23):简单工厂模式

来源:互联网 发布:em算法,知乎 编辑:程序博客网 时间:2024/05/20 20:58

使用频率:★★★★☆

一、什么是简单工厂模式

一个工厂方法,依据传入的参数,生成对应的具体产品对象;

二、补充说明

不属于23种GOF设计模式;

工厂方法一般设成静态方法,返回值一般是抽象类或接口,具体的产品类一般继承或实现抽象类、接口;

优点:产品使用者不需要关心产品类的创建过程,与具体产品的实现类达到解耦的效果;

缺点:违背"开放--封闭"原则(OCP),因为新增一个产品类的时候,需要修改原先的工厂方法;

适用场合:当工厂类负责创建的对象比较少的时候;

三、角色

  • 抽象产品
  • 具体产品
  • 具体工厂
  • 产品使用者

具体产品继承抽象产品;

单个具体工厂负责生产不同的具体产品;

产品使用者使用单个具体工厂生产的不同的具体产品;

四、例子

类关系图:

代码:

【抽象产品类】首先,定义一个抽象父亲类,拥有一个name属性和打印name的方法,其次还有若干doSomething方法:

复制代码
package com.pichen.dp.creationalpattern.simplefactory;public abstract class Father {    private String name;    /**     * @return the name     */    public String getName() {        return name;    }    /**     * @param name the name to set     */    public void setName(String name) {        this.name = name;    }        public abstract void printName();        public abstract void doSomething01();    public abstract void doSomething02();    public abstract void doSomething03();}
复制代码

【具体产品类】定义具体的中国父亲类和美国父亲类,继承抽象父亲类,并实现printName等方法:

复制代码
package com.pichen.dp.creationalpattern.simplefactory;public class ChineseFather extends Father{    public ChineseFather(String name) {        this.setName(name);    }                @Override    public void printName() {        System.out.println(this.getClass().getName() + ":" + this.getName());    }    @Override    public void doSomething01() {        // TODO Auto-generated method stub            }    @Override    public void doSomething02() {        // TODO Auto-generated method stub            }    @Override    public void doSomething03() {        // TODO Auto-generated method stub            }}
复制代码
复制代码
package com.pichen.dp.creationalpattern.simplefactory;public class AmericanFather extends Father{    public AmericanFather(String name) {        this.setName(name);    }                @Override    public void printName() {        System.out.println(this.getClass().getName() + ":" + this.getName());    }    @Override    public void doSomething01() {        // TODO Auto-generated method stub            }    @Override    public void doSomething02() {        // TODO Auto-generated method stub            }    @Override    public void doSomething03() {        // TODO Auto-generated method stub            }}
复制代码

【简单工厂类】定义一个简单共产类,并定义一个静态生产方法,根据传进来的type参数生成对应的具体父亲类:

复制代码
package com.pichen.dp.creationalpattern.simplefactory;import com.pichen.dp.common.exception.DPException;public class SimpleFactory {    public static Father produce(String type, String name) throws DPException{        if("cn".equals(type)){            return new ChineseFather(name);        }else if("us".equals(type)){            return new AmericanFather(name);        }else{            throw new DPException("invalid param~");        }    }}
复制代码

【产品使用类】开始测试使用产品,首选写个makeMoney方法:由工厂类生产一个父亲类,并开始赚钱,最后返回由工厂生产的具体父亲类实例;

main方法:调用makeMoney方法,并打印具体父亲类的name;

具体看代码:

复制代码
package com.pichen.dp.creationalpattern.simplefactory;import com.pichen.dp.common.exception.DPException;public class Main {    public static Father makeMoney(String type, String name) {        Father father = null;        /* 调用共产方法,创建具体产品类 */        try {            father = SimpleFactory.produce(type, name);        } catch (DPException e) {            System.out.println("exception happend when produce " + type + " obj~");            e.printStackTrace();        }                /* 具体赚钱的步骤 */        if(father != null){            father.doSomething01();            father.doSomething02();            father.doSomething03();        }                return father;    }        public static void main(String[] args) {        Father cnFather = Main.makeMoney("cn", "cn father");                if (cnFather != null)            cnFather.printName();                Father usFather = Main.makeMoney("us", "us father ");        if (usFather != null)            usFather.printName();                Father apple = Main.makeMoney("fruit","apple");        if (apple != null)            apple.printName();    }}
复制代码

【其它】异常类DPException:

复制代码
package com.pichen.dp.common.exception;public class DPException extends Exception{    /**     *      */    private static final long serialVersionUID = 8110345414312602844L;    public DPException(String msg){        super(msg);        System.out.println("DPException~");    }}
复制代码

 


@Author      风一样的码农
@HomePageUrl http://www.cnblogs.com/chenpi/ 
@Copyright      转载请注明出处,谢谢~ 
阅读全文
0 0