原文地址:https://jaune162.blog/design-pattern/simple-factory-pattern/
简介
简单工厂模式是一种非常常用的设计模式,但是并不属于GoF中的23种设计模式。简单设计模式有很多种实现方式。
本文我们就来讨论简单工厂模式的实现方式,以及如何借助Spring实现一个扩展性很好的简单工厂模式。
定义及实现
定义
- creates objects without exposing the instantiation logic to the client.
- refers to the newly created object through a common interface
- 创建对象但是不想客户端暴露对象实例化的逻辑
- 通过通用接口引用新创建的对象
结构
- Product:商品接口。
- ConcreteProductA和ConcreteProductB:分别为商品的两个实现。
- Factory:工厂,创建商品实例,并将商品实例返回给客户端供客户端调用。
- Client:客户端,商品的使用者。
实现
public interface Product {void doSomething();
}public class ConcreteProductA implements Product {@Overridepublic void doSomething() {System.out.println("This is product A");}
}public class ConcreteProductB implements Product {@Overridepublic void doSomething() {System.out.println("This is product B");}
}public class Factory {public Product createProduct(String type) {if (type.equalsIgnoreCase("A")) {return new ConcreteProductA();} else if (type.equalsIgnoreCase("B")) {return new ConcreteProductB();}throw new RuntimeException("不支持的类型");}
}public class Client {public static void main(String[] args) {Factory factory = new Factory();Product product = factory.createProduct("A");product.doSomething();}
}
其实简单工厂模式的核心就是下面的代码
if (type.equalsIgnoreCase("A")) {return new ConcreteProductA();
} else if (type.equalsIgnoreCase("A")) {return new ConcreteProductB();
}
通过判断传入的参数,然后根据参数创建不同的对象。
这种方式的弊端就是我们没增加一种Product
的实现,都需要修改工厂类。下面我们将一种不用修改工厂类的方法。
将产品注册到工厂
Product
、ConcreteProductA
、ConcreteProductB
不变。
public class Factory {public Map<String, Class<? extends