补充:
设计模式的组成L:模式名称,环境和名称,解决方案,效果
一、简单工厂模式
本质:选择实现
应用场景:1、想要完全封装隔离具体实现,让外部只能通过接口来操作封装体。2、集中管理控制
public abstract class Operation {
private double numberA;
private double numberB;
public double getNumberB() {
return numberB;
}
public void setNumberB(double numberB) {
this.numberB = numberB;
}
public double getNumberA() {
return numberA;
}
public void setNumberA(double numberA) {
this.numberA = numberA;
}
public abstract double getResult() throws Exception;
}
public class OperationFactory {
public static Operation createOperation(String operate) {
Operation oper = null;
switch (operate) {
case "+":
oper = new Add();
break;
case "-":
oper = new Sub();
break;
case "*":
oper = new Mul();
break;
case "/":
oper = new Div();
break;
}
return oper;
}
}
package 简单工厂模式_计算器四则运算;
public class client {
public static void main(String[] args) throws Exception {
Operation oper = OperationFactory.createOperation("+");
oper.setNumberA(5);
oper.setNumberB(10);
System.out.println(oper.getResult());
}
}
二、工厂方法模式
工厂方法模式(多态性的工厂模式):定义一个用于创建对象的接口,让子类决定实例化哪一个类,工厂方法使得一个类的实例化延迟到其子类。平行等级结构,一一对应。
本质:延迟到子类来选择实现
在简单工厂方法模式的基础上,为每一个运算定义一个工厂类,每一个都去实现总的工厂接口。相比于简单工厂模式,去除了switch,不用再修改原有的总的工厂类了。
public abstract class Operation {
private double numberA;
private double numberB;
public double getNumberB() {
return numberB;
}
public void setNumberB(double numberB) {
this.numberB = numberB;
}
public double getNumberA() {
return numberA;
}
public void setNumberA(double numberA) {
this.numberA = numberA;
}
public abstract double getResult() throws Exception;
}
package 工厂方法模式_计算器四则运算;
public interface OperationFactory {
public Operation createOperation();
}
package 工厂方法模式_计算器四则运算;
public class AddFactory implements OperationFactory {
@Override
public Operation createOperation() {
Operation oper = new Add();
return oper;
}
}
package 工厂方法模式_计算器四则运算;
public class client {
public static void main(String[] args) throws Exception {
OperationFactory operationFactory = new AddFactory();
Operation oper = operationFactory.createOperation();
oper.setNumberA(5);
oper.setNumberB(20);
System.out.println(oper.getResult());
}
}
三、两个模式总结
简单工厂模式中,工厂类用于创建各种各样的产品,根据输入来的参数不同,创建出不一样的产品。但是如果有新的产品要加入,我们需要修改工厂类中的代码,这违背了开放封闭原则,并且对于工厂类有着较大的依赖。所以引出工厂方法模式。
工厂方法模式是类的创建模式,其用意是定义一个创建产品对象的工厂接口,将创建产品工作推迟到子类中,**在工厂方法模式中,核心的工厂类不再不再负责所有产品的创建,而是将具体的创建工作交给子类去做。**这个核心类仅仅负责给出工厂必须是实现的接口,而不接触哪一个产品类被实例化这种细节。这使得工厂方法模式可以允许系统在不修改工厂角色的情况下引进新的产品。这时候如果有新的类需要工厂创建,直接再定义一个新工厂类继承工厂接口即可。
在工厂方法模式中,工厂类与产品类往往具有平行的等级结构,它们之间一一对应。工厂方法模式是简单工厂模式的进一步抽象和推广。由于使用了多态性,工厂方法模式保持了简单工厂模式的优点,并且克服了缺点。
两个模式对比:
工厂方法模式与简单工厂模式在结构上的不同不是很明显。工厂方法类的核心是一个抽象工厂类,而简单工厂模式把核心放在一个具体的类上。工厂方法模式有一个别名是多态性工厂模式,因为具体工厂模式都有共同的接口,或者有共同的抽象父类。
工厂方法模式优缺点分析:
当系统扩展需要添加i新的产品对象时,仅仅需要添加一个具体对象以及一个具体的工厂对象,原有工厂对象不需要进行任何修改,也不需要修改客户端,较好的符合了开放封闭原则。而简单工厂模式在添加新的产品对象后不得不修改工厂方法,扩展性不好。
具体产品对象与工厂方法具有耦合性。工厂方法是要创建产品对象的,也就是需要选择具体的产品对象,并创建他们的实例。因此具体产品对象与工厂方法是耦合的。
如果一个了需要创建某个接口的对象,但是又不知道具体的实现,这种情况可以选用工厂方法模式,把创建对象的工作延迟到子类中实现。
如果一个类本身就希望由它的子类来创建所需的对象的时候,应该使用工厂方法模式。