一、定义
定义一个用于创建对象的接口,但是让子类决定将哪一个类实例化。工厂方法模式让一个类的实例化延迟到了子类。
二、工厂方法模式结构图
三、工厂方法模式代码实现
抽象产品: 将要批量生产的对象实体进行一个抽象提取,便于扩展更多实体
public abstract class Product{
//所有产品类的公共业务方法
public void methodSame(){
//公共方法的实现
}
//声明抽象业务方法
public abstract void methodDiff();
}
具体产品:继承抽象产品,将产品实例化:比如(披萨是抽象产品,实例化产品可以是各种口味的披萨,胡椒味,麻辣味等等)
public class ConcreteProduct extdents Product{
//实现业务方法
public void methodDiff(){
//业务方法的实现
}
}
抽象工厂 :对具体工厂进行的一个统一抽象,便于后面的扩展
public interface Factory{
public Product factoryMethod();
}
具体工厂:返回工厂的具体产品
public class ConcreteFactory implements Factory{
public Product factryMethod(){
return new ConcreteProduct();
}
}
四、工厂方法模式优缺点
优点:
- 工厂方法模式中,工厂方法用来创建客户所需要的产品,同时还向客户隐藏了哪种具体产品类将被实例化这一细节,用户只需要关心所需要产品对应的工厂,无需关心创建的细节,甚至无需知道具体产品类的类名。
- 系统中加入新产品时,无需修改抽象工厂和抽象产品提供的接口,无需修改客户端,也无需修改其他的具体工厂和具体产品,只用添加一个具体工厂和具体产品即可,完全符合开闭原则。
缺点:
- 每添加一个新的具体产品的时候就需要编写新的具体产品类和对应的具体工厂类,当具体产品数量多的时候,类的个数就增加了,会给系统带来额外的开销。
- 考虑到系统的可扩展性,增加了工厂接口这一抽象层,在客户端均使用的抽象层进行定义,增加了系统的抽象性和理解难度。
五、工厂方法模式适用环境
- 客户端不知道它所需要的具体对象类(产品被抽象)
- 抽象工厂类通过其子类来指定创建哪个对象(工厂被抽象)