一. 简单工厂模式简介
定义
- 简单工厂模式又称之静态工厂方法模式,由一个工厂类对象决定创建出哪类产品的实例。通俗的讲,就是通过传参的方式,在工厂类中判断,找出对应的实例返回。
- 在现实中,工厂是负责生产产品的。在设计模式中,简单工厂模式也可以理解为负责生产某个类的实例对象。
UML结构图
- Factory:工厂类,负责创建所有实例对象的内部逻辑,外部可以调用创建实例对象的方法,来得到所需的产品对象;可以理解为工厂中流水线,不同流水线负责生产不同的产品。
- Product:具体产品类,可以理解已经成型的产品,等待出货。
- IProduct:抽象产品类,是所有产品类的父类,可以理解为所有产品共用的零部件。
简单工厂模式的实现
实现步骤
- 创建抽象产品类,定义所有产品的公共接口。
- 创建具体产品类,继承于产品抽象类,
- 创建工厂类,在内部定义静态方法,生产每个具体产品类的实例。
- 外部通过调用工厂类的静态方法,并传入参数来得到所需的产品。
实例
某玩具工厂同时接到了三个不同客户的订单,需要生产一批玩具汽车、玩具飞机、玩具火车。于是工厂开设三条流水线进行生产作业。
代码实现:
一、 创建抽象类,定义产品的公共接口
public abstract class Product {
public abstract void created();
}
二、创建各个具体产品类,继承于抽象产品类,并实现父类的created方法。
public class ToyProduct extends Product{
@Override
public void created() {
System.out.println("玩具汽车已经生产完毕");
}
}
public class AircraftProduct extends Product{
@Override
public void created() {
System.out.println("玩具飞机已经生产完毕");
}
}
public class TrainProduct extends Product{
@Override
public void created() {
System.out.println("玩具火车已经生产完毕");
}
}
三、 创建工厂类,并提供一个静态方法来生产不同的产品,只需传入对应客户类型就可以生产客户需要的产品。
public class ProductFactory {
public static Product createProduct(String type){
Product mProduct=null;
switch (type) {
case "客户1":
mProduct= new ToyProduct();
break;
case "客户2":
mProduct=new TrainProduct();
break;
case "客户3":
mProduct=new AircraftProduct();
break;
default:
throw new NullPointerException("没有"+type+"的产品");
}
return mProduct;
}
}
四、外部调用工厂类的静态方法,并传入客户类型名称得到产品对象并调用created方法。
public class Test {
public static void main(String[] args) {
try {
Product product1 = ProductFactory.createProduct("客户1");
Product product2 = ProductFactory.createProduct("客户2");
Product product3 = ProductFactory.createProduct("客户3");
product1.created();
product2.created();
product3.created();
} catch (Exception e) {
System.out.println(e.getMessage());
}
try {
Product product4 = ProductFactory.createProduct("客户4");
product4.created();
} catch (Exception e) {
System.out.println(e.getMessage());
}
}
}
运行结果:
玩具汽车已经生产完毕
玩具火车已经生产完毕
玩具飞机已经生产完毕
没有客户4的产品
从结果上看出,在工厂类中并没有定义“客户4”的类型下,此时会抛出异常,就此说明了使用简单工厂模式,必须先清楚每个类的具体实例是什么。否则,在外部调用传入未定义的类型,则整个工厂类就会崩溃。
简单工厂模式优缺点及应用场景
优点
- 用户无需关注内部具体实现,只需传入参数就可以得到对应的类实例,避免了直接实例化类,封装具体实现逻辑,降低了与使用者的耦合性。
缺点
- 在实例化类型的时候,必须先知道每个类的具体类型。如果增加新类型,则需要修改工厂类中的静态方法,这不符合开放封闭原则。
应用场景
在知道了简单工厂模式的优缺点,应用场景很明了了
- 客户如果只知道传入工厂类的参数,对于如何创建对象的逻辑不关心时。
- 当工厂类负责创建的对象(具体产品)比较少时。
感谢:
《大话设计模式》、《设计模式之禅》、《Android进阶之光》