Java设计模式之创建型模式-工厂模式(Factory)

来源:互联网 发布:java中new的用法 编辑:程序博客网 时间:2024/05/16 12:50

工厂模式又叫多态性工厂模式。在讲工厂模式之前,先简单讲下工厂模式的一个特殊实现–简单工厂模式,也叫做静态工厂方法模式,其不属于23种GOF设计模式之一。


简单工厂模式:一个工厂方法,依据传入的不同参数,生成对应的具体实例化对象。


简单工厂模式的实现

  我这里以选择手机打电话为例。
  1.创建一个Phone接口(抽象类/普通java类)

public interface Phone {        void call();}

  2.创建实现接口的两个实体类IPhone、MiPhone

public class IPhone implements Phone {    public void call() {        System.out.println("IPhone call...");    }}
public class MiPhone implements Phone {    public void call() {        System.out.println("MiPhone call...");    }}

  3.创建一个工厂类,依据传入的参数,生成对应的实体类对象

public class PhoneFactory {    public static Phone getPhone(String type) {        if ("iphone".equalsIgnoreCase(type)) {            return new IPhone();        } else if ("miphone".equalsIgnoreCase(type)) {            return new MiPhone();        }        return null;    }}

  4.工厂测试类

public class FactoryTest {    public static void main(String[] args) {        Phone phone = PhoneFactory.getPhone("iphone");        if (phone != null) {            phone.call();        } else {            System.out.println("无此手机类型...");        }    }}

输出的结果:IPhone call...

通过上述实例,我们可以看到:
  1.客户端不用去关心实体类对象创建的具体过程,达到了解耦的效果
  2.工厂类可以根绝客户端输入的条件动态的去实例化对应的类

  上述模式的程序还是可扩展的,比如我们要使用华为手机打电话,怎么做?
  我们只需要创建一个新的实体类HuaweiPhone,同时实现IPhone这个接口,然后再在工厂类当中增加一个关于创建HuaweiPhone实例的判断分支。

else if ("huaweiphone".equalsIgnoreCase(type)) {    return new HuaweiPhone();}

  那么问题来了,增加如上的判断分支修改了我们原有的工厂类。换句话说,我们不仅对扩展开放了,而且对修改也开放了,这就有违设计模式六大原则中的开闭原则。
  那么,怎么解决这个问题?这就要来看看工厂方法模式了。


工厂方法模式:定义一个用于创建对象的接口,让子类来决定实例化哪一个类,工厂方法使一个类的实例化延迟到其子类。


工厂模式的实现

  我这里还是以上述例子为例。 
  1.创建一个Phone接口(抽象类/普通java类)

public interface Phone {        void call();}

  2.创建实现接口的两个实体类IPhone、MiPhone

public class IPhone implements Phone {    public void call() {        System.out.println("IPhone call...");    }}
public class MiPhone implements Phone {    public void call() {        System.out.println("MiPhone call...");    }}

  3.创建一个抽象工厂接口

public interface PhoneFactory {    Phone getPhone();}

  4.创建对应实体类的工厂类,并实现抽象工厂接口

public class IPhoneFactory implements PhoneFactory {    public Phone getPhone() {        return new IPhone();    }}
public class MiPhoneFactory implements PhoneFactory {    public Phone getPhone() {        return new MiPhone();    }}

  5.工厂测试类

public class FactoryTest {    public static void main(String[] args) {        PhoneFactory pf = new IPhoneFactory();        Phone p = pf.getPhone();        p.call();    }}

输出的结果:IPhone call...

  通过工厂模式的实例可以发现,当需要新增加产品时,我们只需要增加一个对应的实体类和对应创建实体类的工厂。比如上述增加华为手机的例子,我们只需创建一个新的实体类HuaweiPhone实现IPhone接口,再新建一个新的工厂类HuaweiPhoneFactory实现PhoneFactory接口即可。而不用再对原本的工厂类进行修改,很好的符合开闭原则。

注:关于两者的使用情况
  简单工厂模式:
    工厂类负责创建的对象比较少
    客户端只关心传入的参数,不关心内部具体实现
  工厂模式:
    需要大量创建不同的对象,且这些对象的实体类具有共同接口

阅读全文
2 0
原创粉丝点击