一. 简单工厂思想
在学习工厂方法模式前,先来了解一下简单工厂的缺点
- 违背了开闭原则(对扩展开放,对修改关闭)
- 扩展性不高(要去改动getProduct方法)
- 工厂类(SimpleFactory)与ProductA、ProductB、ProductC的耦合度太高
class SimpleFactory {
//根据type创建不同的产品
public Product createProduct(int type) {
if (type == 0) {
return new ProductA();
} else if (type == 1) {
return new ProductB();
} else{
throw new IllegalArgumentException();
}
}
}
二.介绍
工厂方法模式(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();
}
}
五.优缺点
- 优点
- 将创建者与具体产品解耦(Creator与ProductA、ProductB)
- 符合开闭原则
- 符合单一职责原则(ConcreteCreatorA去创建ProductA,ConcreteCreatorA就去创建ProductB)
- 缺点
- 每增加一个产品就要增加一个对应的工厂类,可能会造成类爆炸
六.在JDK中的应用
- 静态工厂:java.text.NumberFormat#getInstance()
- 工厂方法:java.util.Collection#iterator