简单工厂模式 简单例子
一、概述
简单工厂模式是属于创建型模式,又叫做静态工厂方法(Static Factory Method)模式,但不属于23种GOF设计模式之一。简单工厂模式是由一个工厂对象决定创建出哪一种产品类的实例。简单工厂模式是工厂模式家族中最简单实用的模式,可以理解为是不同工厂模式的一个特殊实现。 -------------来自百度百科
优点
工厂类是整个模式的关键.包含了必要的逻辑判断,根据外界给定的信息,决定究竟应该创建哪个具体类的对象.通过使用工厂类,外界可以从直接创建具体产品对象的尴尬局面摆脱出来,仅仅需要负责“消费”对象就可以了。而不必管这些对象究竟如何创建及如何组织的.明确了各自的职责和权利,有利于整个软件体系结构的优化。
缺点
由于工厂类集中了所有实例的创建逻辑,违反了高内聚责任分配原则,将全部创建逻辑集中到了一个工厂类中;它所能创建的类只能是事先考虑到的,如果需要添加新的类,则就需要改变工厂类了。
当系统中的具体产品类不断增多时候,可能会出现要求工厂类根据不同条件创建不同实例的需求.这种对条件的判断和对具体产品类型的判断交错在一起,很难避免模块功能的蔓延,对系统的维护和扩展非常不利;
这些缺点在工厂方法模式中得到了一定的克服。
使用场景
工厂类负责创建的对象比较少;
客户只知道传入工厂类的参数,对于如何创建对象(逻辑)不关心;
由于简单工厂很容易违反高内聚责任分配原则,因此一般只在很简单的情况下应用。
二、java代码实现
- 问题描述:设计一个用于加减乘除运算的工厂,并提供一个静态方法给客户端运算时使用。
- UML图:
首先是所有运算类的父类Operation,然后是四个最简单的计算类:
package cn.smileyan.design.easyfactory;
/*** @title 计算类* @author Smileyan* @time: 2018/08/29* @description 计算类,作为父类 */
public class Operation {private double num1;private double num2;public double getNum1() {return num1;}public void setNum1(double num1) {this.num1 = num1;}public double getNum2() {return num2;}public void setNum2(double num2) {this.num2 = num2;}// 返回运算结果public double getResult() {return 0;}
}
package cn.smileyan.design.easyfactory;
/*** @title 加法类* @author Smileyan* @time: 2018/08/29* @description 计算类,加法运算 */
public class OperationAdd extends Operation {// 重写父类方法@Overridepublic double getResult() {return this.getNum1()+this.getNum2();}
}
package cn.smileyan.design.easyfactory;
/*** @title 除法类* @author Smileyan* @time: 2018/08/29* @description 计算类,除法运算 */
public class OperationDiv extends Operation {@Overridepublic double getResult() {if(this.getNum2()==0) {System.out.println("除数不能为0");return 0;}return this.getNum1()/this.getNum2();}}
package cn.smileyan.design.easyfactory;
/*** @title 乘法类* @author Smileyan* @time: 2018/08/29* @description 计算类,乘法运算 */
public class OperationMul extends Operation {@Overridepublic double getResult() {return this.getNum1()*this.getNum2();}
}
package cn.smileyan.design.easyfactory;
/*** @title 减法类* @author Smileyan* @time: 2018/08/29* @description 计算类,减法运算 */
public class OperationSub extends Operation {// 重写父类方法@Overridepublic double getResult() {return this.getNum1()-this.getNum2();}
}
其次是工厂类:
package cn.smileyan.design.easyfactory;
/*** @title OperationFactory* @author Smileyan* @description 工厂类,直接与客户打交道的类*/
public class OperationFactory {public static Operation createOperation(String op) {Operation operation=null;// 判断并且确认将返回的对象switch (op) {case "+":operation=new OperationAdd();break;case "-":operation=new OperationSub();break;case "*":operation=new OperationMul();break;case "/":operation=new OperationDiv();break;default:break;}return operation;}
}
最后是我们的客户端,也就是使用这个简单工厂的类,或者说是测试类吧。
package cn.smileyan.design.easyfactory;/*** @title User * @author Smileyan* @description 客户端,即简单工厂的使用者*/
public class User {public static void main(String[] args) {Operation operation=null;// 此处可以更改为其他运算符 而其他地方可以保持不变String op="-"; operation = OperationFactory.createOperation(op);operation.setNum1(99);operation.setNum2(97);System.out.println(operation.getResult());}
}
最终的运行结果可想而知:我们修改main方法中的op变量,而其他地方不需要修改,即可进行各项运算并返回结果。
三、总结
简单工厂模式相对于23种GOF设计模式来说要简单一些,在我们不知不觉中可能已经用过很多次简单工厂模式——尽管我们当初并不知道自己写的代码也算是“模式”。
简单工厂模式 简单例子相关推荐
- js原生设计模式——3简单工厂模式\简单工厂模式封装简单对象
1.Factory基本写法 <!DOCTYPE html> <html lang="en"> <head> <meta chars ...
- 树莓派开发实战项目 智能家居--简单工厂模式(简单工厂模式介绍)
一.搭建模型 二.设计模式的概念引入 1.什么是设计模式 软件设计模式(Design pattern),又称设计模式,是一套被反复使用.多数人知晓的.经过分类编目的.代码设计经验的总结.使用设计模式是 ...
- 面向对象编程设计模式--简单工厂模式讲解(历史上最简单明白的例子)
工作之余,在看资料过程中发现一个极易理解的简单工厂模式的例子,自己亲自试练一番,感觉对这个设计模式不熟悉的朋友, 一看马上就知道是什么回事了. 简单工厂模式根据提供给它的数据,返回几个可能类中的一个类 ...
- C++设计模式之 简单工厂模式讲解(历史上最简单明白的例子)
工作之余,在看资料过程中发现一个极易理解的简单工厂模式的例子,自己亲自试练一番,感觉对这个设计模式不熟悉的朋友, 一看马上就知道是什么回事了. 简单工厂模式根据提供给它的数据,返回几个可能类中的一个类 ...
- python的编程模式-使用简单工厂模式来进行Python的设计模式编程
计模式的目的是让代码易维护.易扩展,不能为了模式而模式,因此一个简单的工具脚本是不需要用到任何模式的. 简单工厂模式又叫静态工厂方法模式,工厂模式家族中最简单的一种模式.这个模式的基本工作方式: 通过 ...
- 轻松看懂java设计模式简单工厂模式
点击上方"好好学java",选择"置顶公众号" 优秀学习资源.干货第一时间送达! 精彩内容 java实战练习项目教程 2018微服务资源springboot.s ...
- java设计模式:简单工厂模式
一.什么是简单工厂模式 简单工厂模式属于类的创建型模式,又叫做静态工厂方法模式.通过专门定义一个类来负责创建其他类的实例,被创建的实例通常都具有共同的父类. 二.简单工厂模式的角色和职责 1.工厂(C ...
- python工厂模式 简书_[Python设计模式] 01 - 简单工厂模式
设计模式的目的是让代码易维护.易扩展,不能为了模式而模式,因此一个简单的工具脚本是不需要用到任何模式的. 简单工厂模式又叫静态工厂方法模式,工厂模式家族中最简单的一种模式.这个模式的基本工作方式: 通 ...
- 设计模式——通过简单工厂模式推出工厂方法模式
文章目录 工厂模式简介 简单工厂模式 工厂方法模式 工厂模式简介 工厂模式,是通过一个工厂来进行创建对象的,我们不用去new对象了,而是直接在工厂中get对象.但是,这样做的好处是什么呢? 实现了解耦 ...
- JAVA设计模式笔记(简单工厂模式)
有一个水果加工工厂,我们的需求是实现加工水果的功能.常见的做法是创建一个水果抽象类,写一个抽象的加工方法,然后创建具体的水果类去继承抽象类,再去实现抽象方法,最后客户端再去新建对象实例. public ...
最新文章
- linux 6.4定时启动,Centos6.4 设置开机自动以某个非root用户启动脚本
- spring-boot-autoconfigure-xx.jar核心注解
- php怎么取json数组元素个数,json,数组_取出json数据中的某一项组成一个数组?,json,数组,php - phpStudy...
- 100%有用的Photoshop实用快捷健介绍
- C语言:使用递归解决汉诺塔问题。
- 前端a链接读取txt文件导出下载_HTML页面点击下载文件的两种实现方法
- TCON控制字及TMOD寄存器
- P18-Vue3后台管理系统-用户管理界面-表格编辑和删除操作
- Word删除页眉横线的方法
- 学报格式和论文格式一样吗_工大学报论文格式要求
- matlab绘制圆极化波,圆极化波及其MATLAB仿真_西电
- 计算机主板供电,你也可以看懂主板供电相数和用料情况,轻松选好主板
- java学习总结(16.07.16)Random类和BigDecimal类
- 发送消息(SendMessage)常识普及
- (二)textarea中placeholder不显示
- 关于绝地求生某辅助白名单画中画逆向分析
- 华为p10自带计算机,华为p10如何连接电脑 华为p10连接电脑教程【图文】
- tmux命令启动MySQL_程序后台运行的几种方法
- 青藤放飞“猎鹰”,主动防御又多一张牌
- 《纸牌屋》:大数据只是噱头
热门文章
- 河南增值税开票系统原服务器地址,河南省增值税发票综合服务平台登录入口:https://fpdk.henan.chinatax.gov.cn...
- ahci驱动,详细教您win10系统下怎么加载ahci驱动
- [转]KSN报告:2014 - 2016年的PC勒索软件
- 【分享】班组5S管理实践办法
- 蒙提霍尔问题(三门问题)的思考与贝叶斯分析
- 源码解析-为什么引入了jackson-dataformat-xml 包我的接口全变成了xml格式?
- log算子 和dog 算子
- Kafka原理以及分区分配策略剖析
- 基于java springmvc+mybatis酒水商城管理系统设计和实现
- matlab对控制系统进行时域和频域联合分析