定义: 简单工厂模式(Simple Factory Pattern)属于类的创新型模式,又叫静态工厂方法模式(Static FactoryMethod Pattern),是通过专门定义一个类来负责创建其他类的实例,被创建的实例通常都具有共同的父类。
解决问题:解决如何实例化对象的问题,根据不同的场景实例化不同的对象
核心思想:用一个专门的类来进行对象的实例
特性:封装、多态
特点:易维护、易扩展、易复用
结构图:
包含的角色:
工厂角色(Creator):这是简单工厂模式的核心,由它负责创建所有的类的内部逻辑。当然工厂类必须能够被外界调用,创建所需要的产品对象。
抽象(Product)产品角色:简单工厂模式所创建的所有对象的父类,注意,这里的父类可以是接口也可以是抽象类,它负责描述所有实例所共有的公共接口。
具体产品(Concrete Product)角色:简单工厂所创建的具体实例对象,这些具体的产品往往都拥有共同的父类。
在具体使用过程中,需求判断具体产品是否有相同的逻辑,没有则使用接口扮演抽象产品的角色,如果有共同的逻辑部分,则使用抽象类进行,共同的东西应该要抽取出来的。
使用场景及代码实现:
需求:实现一个简单的计算器
具体分析:计算器包含有加、减、乘、除,可以抽象为一个 *** 作类,每个具体继承 *** 作类,进行各自具体 *** 作的实现。最主要的核心问题就是实例不同的 *** 作对象,所有用到简单工厂模式。
工厂角色:
public class OperationFactory { public static Operation createFactory(String operator) { Operation operation = null; switch (operator) { case "+": operation = new OperationAdd(); break; case "-": operation = new OperatinSub(); break; case "*": operation = new OperationMul(); break; case "/": operation = new OperatinDiv(); break; default: break; } return operation; } }
抽象角色:
public class Operation { private double numberA; private double numberB; 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 double result() { double result = 0; return result; } }
具体角色:
public class OperationAdd extends Operation{//加 @Override public double result() { return getNumberA()+getNumberB(); } } public class OperationMul extends Operation{//乘 @Override public double result() { // TODO Auto-generated method stub return getNumberA()*getNumberB(); } } public class OperatinDiv extends Operation{//除 @Override public double result() { return getNumberA()/getNumberB(); } } public class OperatinSub extends Operation{//减 @Override public double result() { // TODO Auto-generated method stub return getNumberA()-getNumberB(); } }
测试代码:
public class SimpleFactoryTest { public static void main(String[] args) { double numberA = 0; double numberB = 0; String operate = null; System.out.println("请输入numberA:"); Scanner scanner = new Scanner(System.in); if(scanner.hasNextDouble()) { numberA = scanner.nextDouble(); } Scanner scanner1 = new Scanner(System.in); System.out.println("请输入 *** 作符:+,-,*,/:"); if (scanner1.hasNextLine()) { operate = scanner1.nextLine(); } Scanner scanner2 = new Scanner(System.in); System.out.println("请输入numberB:"); if(scanner2.hasNextDouble()) { numberB = scanner2.nextDouble(); } Operation operation = OperationFactory.createFactory(operate); operation.setNumberA(numberA); operation.setNumberB(numberB); System.out.println(operation.result()); } }
注:案例出自《大话设计模式》
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)