Java 的23中设计模式中,工厂模式一共有三种,分别是:简单工厂模式、工厂方法模式、抽象工厂模式,每种模式都有各自适合的场景,下面分别详细介绍。
简单工厂模式
简单工厂模式一般都是使用静态方法,通过接收的参数的不同来返回不同的实例对象。
实例:
编写一个计算器,具有基础的加减乘除功能。
首先定义基础运算类AbsOperate,里面有一个方法getResult(),用于返回计算结果,
其次,需要接收numberA、numberB两个参数,用于计算。
代码及结构图
public class OperateFactory {
public static AbsOperate createOperation(String type) {
AbsOperate operation = null;
switch (type) {
case "+":
operation = new OperationAdd();
break;
case "-":
operation = new OperationSub();
break;
case "*":
operation = new OperationMul();
break;
case "/":
operation = new OperationDiv();
break;
}
return operation;
}
}
适用场景:
可以根据不同的类型,返回不同的实例对象,另外由于只有一个工厂类,所以工厂类中创建的对象不能太多,否则工厂的业务逻辑就会变得很复杂,所以适用场景为:
(1)需要创建的对象较少;
(2)客户端不关心对象的创建过程。
优劣:
- 优点):工厂类包含必要的逻辑判断,可以根据使用者的条件动态实例化相关的类,对于使用者来说,去除了具体产品的依赖。
- 缺点):增加另外的类型,需要修改到工厂类,相当于扩展开发了,对修改也开放了,违背了“开放-封闭原则”
工厂方法模式
继续上面的例子,如果我们想要实现M的N次方功能,就需要增加
多一个实现M的N次方功能的类,然后修改OperateFactory,增加一个判断分支,因此这个工厂类就与分支耦合了,因此就有了抽象工厂方式。
工厂方法模式是简单工厂的进一步升级,它定义一个用于创建对象的接口,让子类决定实例化哪一个类,工厂方法使一个类的实例化延迟到其子类。
实例:
编写一个计算器,具有基础的加减乘除功能,还有能够求M的N次方。
首先我们还是定义一个IFactory接口,里面有实现者需要实现的方法createOperation,定义一个基类AbsOperate(跟上面一样)。
代码及结构图
IFactory iFactory = new AddFactory();
AbsOperate absOperate = iFactory.createOperation();
absOperate.numberA = 5;
absOperate.numberB = 4;
double result = absOperate.getResult();
适用场景:
(1)客户端不需要知道它所创建的对象的类。
(2)客户端可以通过子类来指定创建对应的对象。
优劣:
优点):克服了简单工厂额开放-封闭原则缺点,又保持了封装对象创建过程的优点。
缺点):每增加一个产品,就需要增加一个产品工厂的类,增加额外的开发量。
抽象工厂模式
抽象工厂模式是工厂方法模式的进一步深化,在这个模式中的工厂类不单单可以创建一个对象,而是可以创建一组对象。
提供一个创建一系列相关或者相互依赖对象的接口而无需指定他们具体的类。