简单工厂模式:由一个工厂对象决定创建出哪一种产品类的实例。
1.简单工厂模式是属于创建型模式,又叫做静态工厂方法模式,但不属于23种GOF设计模式之一。
2.优点:工厂类是整个模式的关键.包含了必要的逻辑判断,根据外界给定的信息,决定究竟应该
创建哪个具体类的对象.通过使用工厂类,外界可以从直接创建具体产品对象的尴尬局面摆脱出来,
仅仅需要负责“消费”对象就可以了。而不必管这些对象究竟如何创建及如何组织的.明确了各自的
职责和权利,有利于整个软件体系结构的优化。
3.缺点:由于工厂类集中了所有实例的创建逻辑,违反了高内聚责任分配原则,将全部创建逻辑集中到
了一个工厂类中;它所能创建的类只能是事先考虑到的,如果需要添加新的类,则就需要改变工厂类了。
可通过工厂方法模式克服该缺点。
/** * 算法操作基类 */ public class Operation { // 数值A private double numberA; // 数值B private double numberB; public double getResult(){ double result = 0; return result; } public double getNumberA() { return numberA; } public void setNumberA(double numberA) { this.numberA = numberA; } public double getNumberB() { return numberB; } public void setNumberB(double numberB) { this.numberB = numberB; } }
/** * 实现加法的具体运算,继承运算类 */ public class OperationAdd extends Operation { @Override public double getResult() { double result = 0; result = getNumberA() + getNumberB(); return result; } }
/** * 实现减法的具体运算,继承运算类 */ public class OperationSub extends Operation { @Override public double getResult() { double result = 0; result = getNumberA() - getNumberB(); return result; } }
/** * 实现乘法的具体运算,继承运算类 */ public class OperationMul extends Operation { @Override public double getResult() { double result = 0; result = getNumberA() * getNumberB(); return result; } }
/** * 实现除法的具体运算,继承运算类 */ public class OperationDiv extends Operation { @Override public double getResult(){ double result = 0; if(getNumberB()==0){ throw new RuntimeException("除数不能为0"); } result = getNumberA() / getNumberB(); return result; } }
/** * 运算符操作符枚举类 */ public enum OperateEnum { Add,Div,Mul,Sub; }
/** * 简单运算工厂类 */ public class OperationFactory { // 根据传入的运算符,创建具体的运算类 public static Operation createOperate(OperateEnum operate){ Operation oper = null; switch(operate){ case Add: oper = new OperationAdd(); break; case Mul: oper = new OperationMul(); case Sub: oper = new OperationSub(); case Div: oper = new OperationDiv(); } return oper; } }
public class Main { public static void main(String[] args) { Operation oper = OperationFactory.createOperate(OperateEnum.Add); oper.setNumberA(10); oper.setNumberB(15); System.out.println(oper.getResult()); oper = OperationFactory.createOperate(OperateEnum.Mul); oper.setNumberA(10); oper.setNumberB(15); System.out.println(oper.getResult()); } }
工厂方法模式:定义一个用于创建对象的接口,让子类决定实例化哪一个类。
工厂方法使一个类的实例化延迟到其子类。
与简单工厂模式的对比:
1.简单工厂模式的最大优点在于工厂类中包含了必要的逻辑判断,根据客户端的选择条件动态
实例化相关的类,对于客户端来说,去除了与具体的产品的依赖。
缺点是对扩展开放,对修改也开放,违背了开放-封闭原则。
2.工厂方法模式的优点是克服了简单工厂违背了开放-封闭原则的缺点,又保持了封装对象创建
过程的优点,是简单工厂模式的进一步抽象和推广。
缺点是每添加一个产品,就得添加一个产品工厂的类。
工厂方法模式实例:
/** * 算法操作基类 * */ public class Operation { // 数值A private double numberA; // 数值B private double numberB; public double getResult(){ double result = 0; return result; } public double getNumberA() { return numberA; } public void setNumberA(double numberA) { this.numberA = numberA; } public double getNumberB() { return numberB; } public void setNumberB(double numberB) { this.numberB = numberB; } }
/** * 实现加法的具体运算,继承运算类 */ public class OperationAdd extends Operation { @Override public double getResult() { double result = 0; result = getNumberA() + getNumberB(); return result; } }
/** * 实现减法的具体运算,继承运算类 */ public class OperationSub extends Operation { @Override public double getResult() { double result = 0; result = getNumberA() - getNumberB(); return result; } }
/** * 实现乘法的具体运算,继承运算类 */ public class OperationMul extends Operation { @Override public double getResult() { double result = 0; result = getNumberA() * getNumberB(); return result; } }
/** * 实现除法的具体运算,继承运算类 */ public class OperationDiv extends Operation { @Override public double getResult(){ double result = 0; if(getNumberB()==0){ throw new RuntimeException("除数不能为0"); } result = getNumberA() / getNumberB(); return result; } }
/** * 运算类工厂接口 * */ public interface IFactory { public Operation createOperation(); }
/** * 加法类工厂 * */ public class FactoryAdd implements IFactory { public Operation createOperation() { // 返回加法运算类实例 return new OperationAdd(); } }
/** * 减法类工厂 * */ public class FactorySub implements IFactory { public Operation createOperation() { // 返回减法运算类实例 return new OperationSub(); } }
/** * 乘法类工厂 * */ public class FactoryMul implements IFactory { public Operation createOperation() { // 返回乘法运算类实例 return new OperationMul(); } }
/** * 除法类工厂 * */ public class FactoryDiv implements IFactory { public Operation createOperation() { // 返回除法运算类实例 return new OperationDiv(); } }
/** * 工厂方法实例(计算器工厂) * */ public class Main { public static void main(String[] args) { // 加法运算,取得加法工厂类 IFactory factory = new FactoryAdd(); Operation operation = factory.createOperation(); operation.setNumberA(10); operation.setNumberB(30); System.out.println(operation.getResult()); // 减法运算,取得减法工厂类 factory = new FactorySub(); operation = factory.createOperation(); operation.setNumberA(10); operation.setNumberB(30); System.out.println(operation.getResult()); } }