一 介绍
所谓工厂,就是生产产品的,那么对于代码的工厂应该怎么理解呢?
简单工厂模式属于创建性模型,但不属于23种GOF设计模式之一。简单工厂模式虽然不是一个标准的设计模式,但是它常用了,所以掌握好它,就当是学习设计模式的热身吧。
二 定义
提供一个创建对象实例的功能,而无需关心其具体实现。被创建实例的类型可以是接口,抽象类,也可以是具体类。
三 模拟场景
现在模拟一个汽车的生产工厂,有两个汽车生产工厂,分别生产Audi和Benz汽车,现在用简单工厂模式来模拟实现过程。
简单工厂模式的UML图如下所示:
根据UML图,简单工厂模式的实现步骤为
1 创建一个接口,模拟汽车工厂汽车生产的核心过程。
public interface CarProduct {
void productCar();
}
2 创建两个汽车生产工厂,分别生产Audi和Benz汽车。
Audi生产过程
public class AudiCarFactory implements CarProduct {
@Override
public void productCar() {
System.out.println("生产了一辆Adui车");
}
}
Benz生产过程
public class BenzCarFactory implements CarProduct {
@Override
public void productCar() {
System.out.println("生产了一辆Benz车");
}
}
如果不用简单工厂模式,如果客户需要一台Audi和Benz汽车,则实现过程如下:
客户端实现:
// 生产Audi汽车
AudiCarFactory audiCarFactory=new AudiCarFactory();
audiCarFactory.productCar();
// 生产Benz汽车
BenzCarFactory benzCarFactory=new BenzCarFactory();
benzCarFactory.productCar();
有什么问题呢,可以看到,两个工厂的实现,都在客户端暴露出来了。假设你有很多的客户,每个客户都是这种操作,如果生产汽车的工艺提升了,也就是说AudiCarFactory这个类发生了变化,导致new的时候必须要变化时,你就不得不到每个客户那修改。实际上是耦合比较高的表现。
下面用简单工厂实现:
3 建立生产工厂
public class CarFactory {
public CarProduct getCarFactory(String type) {
if (type == null) {
return null;
}
switch (type) {
case "audi":
return new AudiCarFactory();
case "benz":
return new BenzCarFactory();
default:
return null;
}
}
}
4 客户端实现
// 得到工厂对象
CarFactory carFactory=new CarFactory();
// 生产Audi汽车
AudiCarFactory audiCarFactory= (AudiCarFactory) carFactory.getCarFactory("audi");
audiCarFactory.productCar();
// 生产Benz汽车
BenzCarFactory benzCarFactory= (BenzCarFactory) carFactory.getCarFactory("benz");
benzCarFactory.productCar();
以上实现了简单工厂模式,可以看到,在客户端不用进行new操作就可以获取实例,实现了解耦,实现简单,如果要新增一个实例,只要新增一个实现类和修改工厂方法即可,客户端无需关心实现类。
网友评论