TypechoJoeTheme

IT技术分享

统计

工厂方法模式——23种设计模式之创建型模式

2015-06-21
/
0 评论
/
549 阅读
/
正在检测是否收录...
06/21

工厂方法模式是类的创建模式,又叫做虚拟构造子(Virtual Constructor)模式或者多态性工厂(Polymorphic Factory)模式。

对于简单工厂模式,类的创建依赖于工厂,如果类的种类变化,相应的工厂类也需要进行修改,这违背了闭包原则。工厂方法模式的解决方法:创建一个工厂接口以及多个工厂实现类,这样一旦需要增加新的功能,直接增加新的工厂类就可以了。

一、与简单工厂模式的比较

工厂方法模式和简单工厂模式有明显的不同,工厂方法模式的核心是一个抽象工厂类,可允许许多具体工厂类从抽象工厂类中将创建行为继承下来,从而成为多个简单工厂模式的综合,推广了简单工厂模式。

  • ①、工厂方法模式由于使用了多态性,工厂方法模式保持了简单工厂模式的优点,而且克服了它的缺点。
  • ②、工厂方法模式可用来允许系统在不修改具体工厂角色的情况下引进新的产品。而简单工厂模式不行。

二、类图表示

工厂方法模式涉及到“抽象工厂角色”(Creator)、“具体工厂角色(Concrete  Creator)”,“抽象产品角色(Product)” 以及“ 具体产品角色(Concrete Product)” 等四个角色。

  • ①、抽象工厂角色:声明工厂方法,该方法返回一个Product类型的对象。
  • ②、具体工厂角色:重定义工厂方法以返回一个ConcreteProduct实例
  • ③、抽象产品角色:定义工厂方法所创建的对象的接口,在最简单情况下,可简化为一个标识接口。
  • ④、具体产品角色:具体产品,实现Product接口,该模式所创建的任何对象都是这个角色的实例。

java-factory-method-model-1

二、代码示例

/*定义一个接口或者一个抽象类*/

interface A{

    public void method_A();/*需要重写的方法*/

    public void method_B();/*公共相同的方法,需要写实现类*/

}
/*第一个实现类*/

class A1 implements A{

    @Override

    public void method_A(){

        System.out.println("I am A1");

    }

}
/*第二个实现类*/

class A2 implements A{

    @Override

    public void method_A(){

        System.out.println("I am A2");

    }

}
/*定义工厂接口*/

public interface Factory{

    public Factory create();

}
/*定义工厂实现类A1*/

public class Factory_A1 implementsFactory{

    @Override

    public Factory create(){

        return new A1();
    }

}
/*定义工厂实现类A2*/

public class Factory_A2 implementsFactory{

    @Override

    public Factory create(){

        return new A2();
    }

}
/*测试用*/

class Test{

    public static void main(Strings[] args){

        Factory f = new Factory_A1();

        A a = f.create();

        a.method_A();

        a.method_B();

    }

}

三、优缺点分析

1、优点

  • ①、多态性:客户代码可以做到与特定应用无关,适用于任何实体类。
  • ②、扩展性好,在增加产品类的情况下,只需要适当修改具体的工厂类或扩展一个工厂类,就可“拥抱变化”。
  • ③、屏蔽产品类。产品类的实现如何变化,调用者都不需要关心,只需关心产品的接口。
  • ④、典型的解耦框架。高层模块只需要知道产品的抽象类,其他的实现类都不需要关心。
  • ⑤、 良好的封装性,符合“开-闭”原则, 符合迪米特法则,符合依赖倒置原则,符合里氏替换原则。

2、缺点

需要Creator和相应的子类作为工厂方法载体,如果应用需要creator和子类则很好;否则,需要增加一个类层次

四、适用场景

  • ①、客户端不需要知道具体产品类的类名,只需要知道所对应的工厂即可。
  • ②、一个类通过其子类来指定创建哪个对象
  • ③、将创建对象的任务委托给工厂子类的某一个,无须关心是哪一个工厂子类创建产品,课需要时动态指定。
朗读
赞 · 0
版权属于:

IT技术分享

本文链接:

https://idunso.com/archives/361/(转载时请注明本文出处及文章链接)