博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
简单工厂模式
阅读量:3951 次
发布时间:2019-05-24

本文共 5078 字,大约阅读时间需要 16 分钟。

实现加减乘除。。并容易扩展其他运算方式

工厂具有逻辑判断功能,一个工厂实现不同类的创建。

一、简单工厂模式

å¨è¿éæå¥å¾çæè¿°

代码:

class operationfactory{	public static operation creationoperation(String operation)	{		operation oper=null;		switch(operation)		{		  case "+":oper=new add1();break;		  case "-":oper=new subtract();break;		  case "*":oper=new ride();break;		  case "/":oper=new divided();break;		}		return oper;	}}

 源代码:

import java.util.Scanner;public class simplefactory {	public static void main(String[] args) {		// TODO Auto-generated method stub      Scanner sc=new Scanner(System.in);      operation oper;      System.out.println("输入操作符");      oper= operationfactory.creationoperation(sc.next());      System.out.println("输入第一个操作数");      oper.num1=sc.nextDouble();      System.out.println("输入第二个操作数");      oper.num2=sc.nextDouble();      System.out.println( "运算结果:"+oper.Getresult());            	}}abstract class operation{	public double num1,num2;	public abstract double Getresult();}class add1 extends operation{	@Override	public double Getresult() {		// TODO Auto-generated method stub		return num1+num2;	}}class subtract extends operation{	@Override	public double Getresult() {		// TODO Auto-generated method stub		return num1-num2;	}}class ride extends operation{	@Override	public double Getresult() {		// TODO Auto-generated method stub		return num1*num2;	}}class divided extends operation{	@Override	public double Getresult() {		// TODO Auto-generated method stub		return num1/num2;	}}class operationfactory{	public static operation creationoperation(String operation)	{		operation oper=null;		switch(operation)		{		  case "+":oper=new add1();break;		  case "-":oper=new subtract();break;		  case "*":oper=new ride();break;		  case "/":oper=new divided();break;		}		return oper;	}}

优点

(1)简单工厂包含必要的判断逻辑,简单工厂实现了对象的创建和使用的分离。

(2)客户端无需知道所创建的具体产品类的类名,只需要具体产品类对应的参数即可!
(3)在不修改任何客户端代码的情况下更换和增加新的具体产品类,在一定程度上提高了系统的灵活性

缺点

(1)工厂类的职责过重,从类图中可以看出简单工厂中包含加减乘除的逻辑判断语句,它一旦有问题,整个系统都要出问题

(2)在添加新的类的时候,例如我添加了开根号运算,那么系统中的简单工厂类就要修改,违反了开放——封闭原则!这样及其不利于系统的扩展和维护!
(3)简单工厂的静态方法,使得工厂角色无法形成基于继承的等级结构!
改进:对工厂类实现分类实现单一职责原则,开闭原则,防止源代码的过度曝光;每一种方法都对应一个工厂。。

二、工厂方法模式

å¨è¿éæå¥å¾çæè¿°

代码:

interface operationfactory{	operation creationoperation();}class add1factory implements operationfactory{	@Override	public operation creationoperation() {		// TODO Auto-generated method stub		return new add1();	}}class subtractfactory implements operationfactory{	@Override	public operation creationoperation() {		// TODO Auto-generated method stub		return new subtract() ;	}	}class ridefactory implements operationfactory{	@Override	public operation creationoperation() {		// TODO Auto-generated method stub		return new ride();	}	}class dividedfactory implements operationfactory{	@Override	public operation creationoperation() {		// TODO Auto-generated method stub		return new divided();	}	}

 源代码:

import java.util.Scanner;public class factory {	public static void main(String[] args) {		// TODO Auto-generated method stub      Scanner sc=new Scanner(System.in);      operationfactory operfactory=null;      System.out.println("输入操作符");      switch(sc.next())		{		  case "+":operfactory=new add1factory();break;		  case "-":operfactory=new subtractfactory();break;		  case "*":operfactory=new ridefactory();break;		  case "/":operfactory=new dividedfactory();break;		}      operation oper=operfactory.creationoperation();      System.out.println("输入第一个操作数");      oper.num1=sc.nextDouble();      System.out.println("输入第二个操作数");      oper.num2=sc.nextDouble();      System.out.println( "运算结果:"+oper.Getresult());            	}}abstract class operation{	public double num1,num2;	public abstract double Getresult();}class add1 extends operation{	@Override	public double Getresult() {		// TODO Auto-generated method stub		return num1+num2;	}}class subtract extends operation{	@Override	public double Getresult() {		// TODO Auto-generated method stub		return num1-num2;	}}class ride extends operation{	@Override	public double Getresult() {		// TODO Auto-generated method stub		return num1*num2;	}}class divided extends operation{	@Override	public double Getresult() {		// TODO Auto-generated method stub		return num1/num2;	}}interface operationfactory{	operation creationoperation();}class add1factory implements operationfactory{	@Override	public operation creationoperation() {		// TODO Auto-generated method stub		return new add1();	}}class subtractfactory implements operationfactory{	@Override	public operation creationoperation() {		// TODO Auto-generated method stub		return new subtract() ;	}	}class ridefactory implements operationfactory{	@Override	public operation creationoperation() {		// TODO Auto-generated method stub		return new ride();	}	}class dividedfactory implements operationfactory{	@Override	public operation creationoperation() {		// TODO Auto-generated method stub		return new divided();	}	}

优点:

(1)工厂方法用来创建客户所需要的产品,同时隐藏了哪种具体产品类将被实例化的细节,用户只需要要关注工厂,不需要关注创建的细节!从客户端代码就可以看出!只知道对应的工厂就好!

(2)在增加修改新的运算类的时候不用修改代码,只需要增加对应的工厂就好,完全符合开放——封闭性原则!
(3)创建对象的细节完全封装在具体的工厂内部,而且有了抽象的工厂类,所有的具体工厂都继承了自己的父类!完美的体现了多态性!

缺点:

(1)在增加新的产品(对应UML图的算法)时,也必须增加新的工厂类,会带来额外的开销。
(2)抽象层的加入使得理解程度加大。
 

转载地址:http://yxyzi.baihongyu.com/

你可能感兴趣的文章
i2c-adapter的注册过程
查看>>
container_of()宏
查看>>
Linux设备驱动之I2C架构分析
查看>>
通信设备硬件工程师应该具备的基本能力和知识-1
查看>>
通信设备硬件工程师应该具备的基本能力和知识-2
查看>>
年轻工程师如何锻炼成高手的
查看>>
Android 源码编译 文件系统制作
查看>>
Android文件系统深入剖析
查看>>
Android build system note
查看>>
编写Linux下Input设备的检测程序
查看>>
Android Recovery模式
查看>>
android恢复出厂设置以及系统升级流程
查看>>
嵌入式系统 Boot Loader 技术内幕
查看>>
浅析linux开发工具adb具体实现
查看>>
Adb源码学习
查看>>
浅析linux开发工具adb具体实现
查看>>
清炒土豆丝的做法详细介绍
查看>>
adb 协议
查看>>
Android Debug Bridge 服务详解
查看>>
linux access函数判断文件存取权限
查看>>