定义
工厂方式法模式(Factory Method),定义了一个用于创建对象的接口,让子类决定实例化哪一个类。工厂方法使一个类的实例化延迟到子类。
相关的角色:
抽象产品角色(Product):定义产品的接口
具体产品角色(ConcreteProduct) :实现接口Product的具体产品类
抽象工厂角色(Creator) :声明工厂方法(FactoryMethod),返回一个产品
真实的工厂(ConcreteCreator):实现FactoryMethod工厂方法,由客户调用,返回一个产品的实例
解决问题
解决某个对象的创建工作。
UML类图

例子
其中包抽象工厂角色(Creator),抽象产品角色(Product),真实产品角色(ProductA、ProductB),真实工厂角色(ConcreteCreatorA,ConcreteCreatorB)。
Creator
/**
* @author Armyone
* @date 2019/2/14 15:41
* @desc 抽象工厂角色
*/
public interface Creator {
Product createProduct();
}
Product
/**
* @author Armyone
* @date 2019/2/14 15:39
* @desc 抽象产品角色
*/
public interface Product {
/**
* 展示产品
*/
void showProduct();
}
ProductA
/**
* @author Armyone
* @date 2019/2/14 15:44
* @desc
*/
public class ProductA implements Product {
@Override
public void showProduct() {
System.out.println("ProductA");
}
}
ProductB同ProductA,只是需出不一样。
ConcreteCreatorA
/**
* @author Armyone
* @date 2019/2/14 15:41
* @desc
*/
public class ConcreteCreatorA implements Creator {
@Override
public Product createProduct() {
return new ProductA();
}
}
客户端调用
Creator creatorA = new ConcreteCreatorA();
Product productA = creatorA.createProduct();
productA.showProduct();
Creator creatorB = new ConcreteCreatorB();
Product productB = creatorB.createProduct();
productB.showProduct();
优缺点
优点
- 在工厂方法模式中,工厂方法用来创建客户所需要的产品,同时还向客户隐藏了哪种具体产品类将被实例化这一细节,用户只需要关心所需产品对应的工厂,无须关心创建细节,甚至无须知道具体产品类的类名。
- 基于工厂角色和产品角色的多态性设计是工厂方法模式的关键。它能够使工厂可以自主确定创建何种产品对象,而如何创建这个对象的细节则完全封装在具体工厂内部。工厂方法模式之所以又被称为多态工厂模式,是因为所有的具体工厂类都具有同一抽象父类。
- 使用工厂方法模式的另一个优点是在系统中加入新产品时,无须修改抽象工厂和抽象产品提供的接口,无须修改客户端,也无须修改其他的具体工厂和具体产品,而只要添加一个具体工厂和具体产品就可以了。这样,系统的可扩展性也就变得非常好,完全符合“开闭原则”。
缺点
- 在添加新产品时,需要编写新的具体产品类,而且还要提供与之对应的具体工厂类,系统中类的个数将成对增加,在一定程度上增加了系统的复杂度,有更多的类需要编译和运行,会给系统带来一些额外的开销。
- 由于考虑到系统的可扩展性,需要引入抽象层,在客户端代码中均使用抽象层进行定义,增加了系统的抽象性和理解难度,且在实现时可能需要用到DOM、反射等技术,增加了系统的实现难度。
网友评论