一.简单工厂

将不同的算法用不同的类实现,在工厂类中实例化需要的类返回给客户端,客户端只需要与工厂类打交道就行,不需要知道具体的算法类。

工厂模式是我们最常用的实例化对象模式了,是用工厂方法代替new操作的一种模式。著名的Jive论坛 ,就大量使用了工厂模式,工厂模式在Java程序系统可以说是随处可见。因为工厂模式就相当于创建实例对象的new,我们经常要根据类Class生成实例对象,如A a=new A() 工厂模式也是用来创建实例对象的,所以以后new时就要多个心眼,是否可以考虑使用工厂模式,虽然这样做,可能多做一些工作,但会给你系统带来更大的可扩展性和尽量少的修改量。

二.UML图

三.一个计算器例子

package simpleFactory;
public class Operation {private double result = 0;private double double_numberA = 0;private double double_numberB = 0;public double getDouble_numberA() {return double_numberA;}public void setDouble_numberA(double double_numberA) {this.double_numberA = double_numberA;}public double getDouble_numberB() {return double_numberB;}public void setDouble_numberB(double double_numberB) {this.double_numberB = double_numberB;}public double getResult() {return result;}
}package simpleFactory;
public class OperationAdd extends Operation{@Overridepublic double getResult() {return getDouble_numberA() + getDouble_numberB();}
}package simpleFactory;
public class OperationSub extends Operation{private double result;@Overridepublic double getResult() {result = getDouble_numberA() - getDouble_numberB();return result;}
}package simpleFactory;
public class OperationMul extends Operation{private double result;@Overridepublic double getResult() {result = getDouble_numberA() * getDouble_numberB();return result;}
}package simpleFactory;
public class OperationDiv extends Operation{private double result;@Overridepublic double getResult() {if (getDouble_numberB() == 0)try {throw new Exception("除数不能为0.");} catch (Exception e) {e.printStackTrace();}result = getDouble_numberA() / getDouble_numberB();return result;}
}package simpleFactory;
public class OperationFactory {public static Operation createOperate(String operate) {Operation oper = null;switch (operate) {case "+":oper = new OperationAdd();break;case "-":oper = new OperationSub();break;case "*":oper = new OperationMul();break;case "/":oper = new OperationDiv();break;}return oper;}
}package simpleFactory;
public class Client {public static void main(String[] args) {Operation oper  = OperationFactory.createOperate("+");oper.setDouble_numberA(1);oper.setDouble_numberB(2);double result = oper.getResult();System.out.println(result);}
}

四.优缺点

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

五.使用场景

工厂类负责创建的对象比较少;
客户只知道传入工厂类的参数,对于如何创建对象(逻辑)不关心;
由于简单工厂很容易违反高内聚责任分配原则,因此一般只在很简单的情况下应用。

转载于:https://www.cnblogs.com/wuwuyong/p/9850295.html

简单易懂设计模式——简单工厂模式相关推荐

  1. Java设计模式之 工厂模式(简单工厂模式)

    前一阵子学习了Java 中据说是最简单的设计模式的 单例模式,想一起讨论学习的小伙伴请点击这里: Java 设计模式之单例模式 那么今天就把学习的工厂模式记录下来 工厂模式: 实现了创建者和调用者的分 ...

  2. 简单(静态)工厂模式

    简单(静态)工厂模式 观察者模式 一.背景介绍 工厂模式是设计模式的一种,设计模式是自程序开发逐渐就有的,提高开发效率的一种设计思路,先前的开发者们一直在用,只是后来这四个人出了一本书总结了下,就是现 ...

  3. Java设计模式(工厂模式>抽象工厂模式和原型模式)

    Java设计模式Ⅱ 1.工厂模式 1.1 简单工厂模式 1.2 工厂方法模式 2.抽象工厂模式 3.总结 4.原型模式 4.1 原型模式 4.2 浅拷贝 4.3 深拷贝 5.建造者模式 1.工厂模式 ...

  4. 策略模式和工厂模式的区别_设计模式之工厂模式-工厂方法模式

    设计模式之工厂模式-工厂方法模式 大家好,欢迎来到污污弹公司,今天司小司又接到了一个新活-披萨项目. 来源:凯哥Java(kaigejava) 需求: 披萨项目: 要方便披萨品种的扩展.要便于维护.要 ...

  5. Java 设计模式之工厂模式(二)

    原文地址:Java 设计模式之工厂模式(二) 博客地址:http://www.extlight.com 一.背景 本篇内容是 Java 设计模式创建型模式的第二篇.上一篇主题为 <Java 设计 ...

  6. 设计模式之工厂模式(三)

    上一次我们已经通过代码,简单的认识了工厂方法模式,具体的思路请移步到设计模式之工厂模式(二),进行查看.这次,让我们通过设计模式的思想,来好好认识下工厂方法模式. 创建者和产品 所有工厂模式都用来封装 ...

  7. php工厂模式和单例模式,php 设计模式之工厂模式、单例模式、注册树模式

    php 设计模式之工厂模式.单例模式.注册树模式 在软件工程中,创建型设计模式承担着对象创建的职责,尝试创建适合程序上下文的对象,对象创建设计模式的产生是由于软件工程设计的问题,具体说是向设计中增加复 ...

  8. 教你如何一篇博客读懂设计模式之—--工厂模式

    一篇博客读懂设计模式之-工厂模式 工厂模式在我们日常开发的时候经常用到,相信大家都有了一定的了解,工厂模式是一种创建对象的设计模式,它提供一种创建对象的最佳方式. 主要过程是: 定义一个创建对象的接口 ...

  9. java 工厂模式详解_Java设计模式之工厂模式详解

    简单工厂其实并不是设计模式,只是一种编程习惯. 首先我们创建父类Cup,所有杯子类的父类.再创建它的子类BigCup和SmallCup类. public abstract class Cup { pu ...

最新文章

  1. Kubernetes环境下的各种调试方法
  2. UpdatePanel Repeater内LinkButton造成页面刷新问题
  3. AttributeError: ‘list‘ object has no attribute ‘ndim‘
  4. 环境配置与PyG中图与图数据集的使用
  5. Java 理论与实践: 您的小数点到哪里去了?
  6. 信号与系统—傅里叶级数
  7. 【网络工程师】<软考中级>IP子网划分
  8. 【DB笔试面试642】在Oracle中,什么是基数反馈(Cardinality Feedback)?
  9. 常用复合逻辑运算,与非,或非,异或,同或
  10. python实现雪花飘落的效果_简单说 JavaScript实现雪花飘落效果
  11. [linux虚拟机] 使用yum命令时,解析不了yum源,Cannot find a valid baseurl for repo: base/7/x86_6
  12. 手动清除网卡IP地址的方法
  13. 【考研总结】考研失败后的反省
  14. empress和queen区别_女王英文如何表达 原来扑克牌和女王也有关吗
  15. 风丘科技为您提供电动汽车高压测试方案
  16. 我所理解的 惠普云 (HP Cloud)
  17. 放置js文件的公开服务器,node.js搭建简单静态文件服务器
  18. Python中10个常用的内置函数
  19. 少吃精粮,多吃粗粮 (吃纯燕麦治湿疹)
  20. 阴阳师痒痒鼠挖土魂十python----最简单版本

热门文章

  1. c语言比赛积分程序,C语言积分赛.doc
  2. 数字识别java开源_Java基于opencv实现图像数字识别(三)—灰度化和二值化
  3. dns服务期搭建使用_自己搭建dns服务器
  4. beaninfo详解源码解析 java_【Spring源码分析】Bean加载流程概览
  5. pcb设计单点接地示意图_4种PCB设计中的接地方式解析
  6. Java Servlet技术
  7. 报错, nested exception is com.fasterxml.jackson.databind.exc.MismatchedInputException
  8. SpringClound介绍
  9. C++案例:C++版生命游戏
  10. 大数据学习笔记09:MapReduce概述