一.简单工厂思想
在学习工厂方法模式前,先来了解一下简单工厂,对于产品种类相对较少、后续扩展概率比较低的情况,可以考虑使用简单工厂模式
class SimpleFactory {
//根据type创建不同的产品
public static Product createProduct(int type) {
if (type == 0) {
return new ProductA();
} else if (type == 1) {
return new ProductB();
} else{
throw new IllegalArgumentException();
}
}
}
简单工厂的缺点
- 违背了开闭原则
- 扩展性不高(新增产品要去改动createProduct方法)
- 工厂与具体产品的耦合度太高
二.介绍
工厂方法模式(Factory Pattern)属于创建型模式,含义是在工厂方法中有一个方法负责去返回产品对象。工厂方法模式的本质是将接口/抽象类的实例化过程推迟到了子类。软件中易变的细节可以从派生的实现类来进行扩展,当软件需要发生变化时,只需要根据需求重新派生一个实现类
三.UML类图
四.具体代码
public class Shop {
private Creator creator;
public void setCreator(Creator creator) {
this.creator = creator;
}
public void offerProduct(){
System.out.println(creator.createProduct().getName());
}
public static void main(String[] args) {
Shop shop = new Shop();
shop.setCreator(new ConcreteCreatorA());
shop.offerProduct();
}
}
//抽象产品
interface Product {
String getName();
}
//具体产品
class ProductA implements Product {
@Override
public String getName() {
return "productA";
}
}
//具体产品
class ProductB implements Product {
@Override
public String getName() {
return "productB";
}
}
//抽象工厂
abstract class Creator {
public abstract Product createProduct();
}
//具体工厂
class ConcreteCreatorA extends Creator {
@Override
public Product createProduct() {
return new ProductA();
}
}
//具体工厂
class ConcreteCreatorB extends Creator {
@Override
public Product createProduct() {
return new ProductB();
}
}
五.优缺点
- 优点
- 将调用者与具体产品解耦(Shop与ProductA、ProductB)
- 符合开闭原则
- 符合单一职责原则(明确分割使用对象与管理对象的职责)
- 缺点
- 每增加一个产品就要增加一个对应的工厂类,可能会造成类爆炸
六.在JDK中的应用
-
简单工厂:java.text.NumberFormat#getInstance()
-
工厂方法:java.util.Collection#iterator