您的位置:首页 > 其它

设计模式—工厂方法模式

2016-05-28 10:10 344 查看
本文博客同步发布在http://hjxandhmr.github.io/2016/05/28/DesigPattern-FactoryMethod/

前面我们学习了简单工厂模式,今天我们来学习工厂方法模式(Factory Method),工厂方法模式(Factory Method Pattern)又称为工厂模式,也叫多态工厂(Polymorphic Factory)模式,它属于类创建型模式。

模式定义

在工厂方法模式中,工厂父类负责定义创建产品对象的公共接口,而工厂子类则负责生成具体的产品对象,这样做的目的是将产品类的实例化操作延迟到工厂子类中完成,即通过工厂子类来确定究竟应该实例化哪一个具体产品类。

模式结构

工厂方法模式包含如下角色:

Product: 抽象产品

ConcreteProduct: 具体产品

Factory: 抽象工厂

ConcreteFactory: 具体工厂

UML图



代码实现

Factory.java

public interface Factory {
Product factoryMethod();
}


ConcreteFactory.java

public class ConcreteFactory implements Factory {

@Override
public Product factoryMethod() {
return new ConcreteProduct();
}
}


Product.java

public interface Product {
void use();
}


ConcreteProduct.java

public class ConcreteProduct implements Product {

public ConcreteProduct() {
System.out.println("ConcreteProduct Create");
}

@Override
public void use() {
System.out.println("ConcreteProduct use");
}
}


测试类

public class MyClass {

public static void main(String[] args) {
Factory factory = new ConcreteFactory();
Product product = factory.factoryMethod();
product.use();
}
}


模式分析

工厂方法模式是简单工厂模式的进一步抽象和推广。由于使用了面向对象的多态性,工厂方法模式保持了简单工厂模式的优点,而且克服了它的缺点。在工厂方法模式中,核心的工厂类不再负责所有产品的创建,而是将具体创建工作交给子类去做。这个核心类仅仅负责给出具体工厂必须实现的接口,而不负责哪一个产品类被实例化这种细节,这使得工厂方法模式可以允许系统在不修改工厂角色的情况下引进新产品。

工厂方法模式的优点

在工厂方法模式中,工厂方法用来创建客户所需要的产品,同时还向客户隐藏了哪种具体产品类将被实例化这一细节,用户只需要关心所需产品对应的工厂,无须关心创建细节,甚至无须知道具体产品类的类名。

基于工厂角色和产品角色的多态性设计是工厂方法模式的关键。它能够使工厂可以自主确定创建何种产品对象,而如何创建这个对象的细节则完全封装在具体工厂内部。工厂方法模式之所以又被称为多态工厂模式,是因为所有的具体工厂类都具有同一抽象父类。

+使用工厂方法模式的另一个优点是在系统中加入新产品时,无须修改抽象工厂和抽象产品提供的接口,无须修改客户端,也无须修改其他的具体工厂和具体产品,而只要添加一个具体工厂和具体产品就可以了。这样,系统的可扩展性也就变得非常好,完全符合“开闭原则”。

工厂方法模式的缺点

在添加新产品时,需要编写新的具体产品类,而且还要提供与之对应的具体工厂类,系统中类的个数将成对增加,在一定程度上增加了系统的复杂度,有更多的类需要编译和运行,会给系统带来一些额外的开销。

由于考虑到系统的可扩展性,需要引入抽象层,在客户端代码中均使用抽象层进行定义,增加了系统的抽象性和理解难度,且在实现时可能需要用到DOM、反射等技术,增加了系统的实现难度。

最后,工厂方法模式还满足了迪米特原则,依赖倒转原则,里氏替换原则,是典型的解耦框架。

参考

http://design-patterns.readthedocs.io/zh_CN/latest/creational_patterns/factory_method.html

http://www.cnblogs.com/ytaozhao/p/3389883.html

欢迎大家关注我的微信公众号,我会不定期的分享些Android开发的技巧

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息