设计模式---简单工厂模式+实例

来源:互联网 发布:奢侈品 中国原单 知乎 编辑:程序博客网 时间:2024/05/16 08:02

简单工厂模式:实质是一个工厂类根据传入的参数,动态决定创建哪个产品类的实例,这些产品类继承自一个类或接口;


解决问题:到底实例化谁,将来会不会增加实例化的对象;对于很容易变化的地方,应该考虑用一个单独的类来做这个创造实例的过程。


实例:输入两个数和运算符,得到运算结果

1、创建抽象对象类Operation.java,具体对象类OperateAdd,java,OperateDivide.java,OperateMultiply.java,OperateSubtrct.java,工厂类OperateFactory.java,视图类OperateMain.java


2、具体实现


OperateMain.java:

package com.test.factory;import java.io.BufferedReader;import java.io.IOException;import java.io.InputStreamReader;import java.util.Scanner;import com.sun.corba.se.spi.orb.OperationFactory;public class OperateMain {private static int numberA;private static int numberB;private static InputStreamReader inputStreamReader;private static BufferedReader bufferReader;public static void main(String[] args){try {System.out.println("please input a number:");inputStreamReader = new InputStreamReader(System.in);bufferReader = new BufferedReader(inputStreamReader);numberA = Integer.parseInt(bufferReader.readLine());System.out.println("please input a operate:");Scanner input = new Scanner(System.in);String operate = input.next();System.out.println("please input a number again:");inputStreamReader = new InputStreamReader(System.in);bufferReader = new BufferedReader(inputStreamReader);numberB = Integer.parseInt(bufferReader.readLine());Operation oper = OperateFactory.createOperation(operate);oper.numberA = numberA;oper.numberB = numberB;System.out.println(numberA + operate + numberB + " = "+oper.getResult());} catch (IOException e) {// TODO Auto-generated catch blocke.printStackTrace();}}}



Operation.java:

package com.test.factory;public class Operation {public int numberA,numberB;public float result;public float getResult(){return result;}}



OperateAdd.java:

package com.test.factory;public class OperateAdd extends Operation{@Overridepublic float getResult() {// TODO Auto-generated method stubreturn numberA + numberB;}}



OperateFactory.java:

package com.test.factory;public class OperateFactory {public static Operation createOperation(String operate){if (operate.equals("+")){return new OperateAdd();} else if(operate.equals("-")) {return new OperateSubtract();} else if (operate.equals("*")){return new Operatemultiply();} else if (operate.equals("/")){return new OperateDivide();}return null;}}

3、Operation类中两个int属性,一个getResult方法行为;

加减乘除类都继承Operation类,重写getResult方法;

OperationFactory为工厂类,根据传入的String参数,动态创建具体运算类,创建何种运算类,怎么创建,都在这个类中实现;

4、运行如下:



优点
工厂类是整个模式的关键.包含了必要的逻辑判断,根据外界给定的信息,决定究竟应该创建哪个具体类的对象.通过使用工厂类,外界可以从直接创建具体产品对象的尴尬局面摆脱出来,仅仅需要负责“消费”对象就可以了。而不必管这些对象究竟如何创建及如何组织的.明确了各自的职责和权利,有利于整个软件体系结构的优化。
缺点
由于工厂类集中了所有实例的创建逻辑,违反了高内聚责任分配原则,将全部创建逻辑集中到了一个工厂类中;它所能创建的类只能是事先考虑到的,如果需要添加新的类,则就需要改变工厂类了。
当系统中的具体产品类不断增多时候,可能会出现要求工厂类根据不同条件创建不同实例的需求.这种对条件的判断和对具体产品类型的判断交错在一起,很难避免模块功能的蔓延,对系统的维护和扩展非常不利;
这些缺点在工厂方法模式中得到了一定的克服。
使用场景
工厂类负责创建的对象比较少;
客户只知道传入工厂类的参数,对于如何创建对象(逻辑)不关心;
由于简单工厂很容易违反高内聚责任分配原则,因此一般只在很简单的情况下应用。


工厂方法模式VS简单工厂模式
简单工厂模式的最大优点在于工厂类中包含了必要的逻辑判断,根据客户端的选择条件动态实例化相关类对于客户端来说,去除了与具体产品的依赖。工厂方法模式:定义了一个用于创建对象接口,让子类决定实例化哪一个类。工厂方法使一个类的实例化延迟到其子类。工厂方法模式实现时,客户端需要决定实例化哪一个工厂类来实现运算类,选择判断的问题还是存在,也就是说,工厂方法把简单工厂内容判断移到了客户端来判断。简单工厂主要的缺点是违背的开放-封闭原则。

原创粉丝点击