设计模式------工厂方法模式
工厂方法模式定义一个接口用于创建对象,让子类决定哪一个类实例.工厂方法,使一类延迟到其子类的实例.
角色:
1.抽象工厂(Creator)角色:
是工厂方法模式的核心,与应用程序无关。
不论什么在模式中创建对象的工厂类必须实现这个接口。
2.详细工厂(ConcreteCreator)角色:
这是实现抽象工厂接口的详细工厂类。包括与应用程序密切相关的逻辑,而且受到应用程序调用以创建产品对象。
3.抽象产品(Product)角色:
工厂方法模式所创建的对象的超类型,也就是产品对象的共同父类或共有的接口。
4.详细产品(ConcreteProduct)角色:
这个角色实现了抽象产品角色所定义的接口。
某详细产品有专门的详细工厂创建,它们之间往往一一相应。
结构图:
适用情况:
1.对于某个产品,调用者清楚地知道应该使用哪个详细工厂服务,实例化该详细工厂,生产出详细的产品来。
2.仅仅是须要一种产品,而不想知道也不须要知道到底是哪个工厂为生产的,即终于选用哪个详细工厂的决定权在生产者一方,它们依据当前系统的情况来实例化一个详细的工厂返回给使用者,而这个决策过程对于使用者来说是透明的。
工厂方法模式VS简单工厂模式:
以下以编写“计算器”的小程序为例,对照学习工厂方法模式。
1.简单工厂模式:
简单工厂类:
工厂类中包括了必要的逻辑推断。依据client的选择条件动态实例化相关的类。对于client来说,去除了与详细产品的依赖。当添加其它算法时,须要在工厂类中加case分支条件,这样就违背了“开放-封闭原则”。
简单工厂模式链接
2.工厂方法模式:
工厂方法模式对简单工厂模式进行了抽象,将简单工厂的内部逻辑推断移到了client中。它有一个抽象的Factory类(能够是抽象类和接口)。这个类将不再负责详细的产品生产,仅仅制定一些规范,详细的生产工作由其子类去完毕。
工厂方法模式实现:
运算类:
class Operation{private double _numberA = 0;private double _numberB = 0;public double NumberA{get { return _numberA; }set { _numberA = value; }}public double NumberB{get { return _numberB; }set { _numberB = value; }}/// 得到运算结果 public virtual double GetResult(){double result = 0;return result;}}
加法类:
class OperationAdd : Operation{public override double GetResult(){double result = 0;result = NumberA + NumberB;return result;}}
减法类:
class OperationSub : Operation{...}
乘法类:
class OperationMul : Operation{...}
除法类:
class OperationDiv : Operation{public override double GetResult(){double result = 0;if (NumberB == 0)throw new Exception("除数不能为0。");result = NumberA / NumberB;return result;}}
依据依赖倒转原则。把工厂类抽象出一个接口,这个接口具有一个创建抽象产品的工厂方法,全部生产详细类的工厂,都要实现这个接口。
工厂类:
interface IFactory{Operation CreateOperation();}
加法工厂:
// 专门负责生产“+”的工厂class AddFactory : IFactory{public Operation CreateOperation(){return new OperationAdd();}}
减法工厂:
// 专门负责生产“-”的工厂class SubFactory : IFactory{public Operation CreateOperation(){return new OperationSub();}}
乘法工厂:...
除法工厂:...
client:
static void Main(string[] args){IFactory operFactory = new AddFactory();//进行其它运算时,仅仅需在此改动就可以Operation oper = operFactory.CreateOperation();oper.NumberA = 1;oper.NumberB = 2;double result=oper.GetResult();Console.WriteLine(result);Console.Read();}
最后在控制台窗体显示得数“3”。
分析:
核心工厂类不再负责产品的创建,成为一个抽象工厂角色,使一个类的实例化延迟到其子类,这样进一步抽象化使得工厂方法模式能够使系统在不改动详细工厂角色的情况下引进新的产品。当添加新的算法时,不需更改原有的工厂类,仅仅需添加此功能的运算类和对应的详细生产工厂,仅仅对扩展开放,对改动关闭,弥补了简单工厂的不足,仍保持封装对象创建过程的长处,减少了客户程序与产品对象的耦合。工厂方法的缺点就是每添加一个产品,须要添加这个产品工厂的类,利用反射技术能够进行完好。
小编寄语:通过写博客。加深了理解,沉淀了知识。欢迎大家指点,我们共同进步。
版权声明:本文博主原创文章,博客,未经同意不得转载。
设计模式------工厂方法模式相关推荐
- 4. 星际争霸之php设计模式--工厂方法模式
题记 ============================================================================== 本php设计模式专辑来源于博客(jy ...
- java 工厂方法_java设计模式-工厂方法模式
1.工厂方法(FactoryMethod)模式的定义 定义一个创建产品对象的工厂接口,将产品对象的实际创建工作推迟到具体子工厂类当中.这满足创建型模式中所要求的"创建与使用相分离" ...
- 设计模式 | 工厂方法模式及典型应用
工厂方法模式 工厂方法模式(Factory Method Pattern):定义一个用于创建对象的接口,让子类决定将哪一个类实例化.工厂方法模式让一个类的实例化延迟到其子类. 工厂方法模式又简称为工厂 ...
- python工厂模式 django_python设计模式-工厂方法模式
题目:假设你有一个 pizza 店,功能包括下订单.做 pizza,你的代码会如何写呢? def order_pizza(): pizza = Pizza() pizza.prepare() pizz ...
- 工厂方法模式_1天1个设计模式——工厂方法模式
意图 工厂方法模式是一种创建型设计模式, 其在父类中提供一个创建对象的方法, 允许子类决定实例化对象的类型. 问题 假设你正在开发一款物流管理应用.1.0版本只能支持处理卡车运输,因此大部分的代码都位 ...
- [设计模式] ------ 工厂方法模式
工厂方法模式 手机厂造手机,肥皂厂造肥皂,药品厂造药品. 假设有一大类对象A1,A2,A3,A4-他们都有一个共同的父类A A1可以想成是手机,A2可以想成肥皂- (下面例子的A1Factory就是手 ...
- JAVA设计模式 - 工厂方法模式
工厂方法模式(Factory Pattern) 是一种创建型设计模式 , 它是Java中最常用的设计模式之一 . 1 . 工厂方法模式的定义 定义一个创建对象的接口 , 让子类决定实例化哪一个类 . ...
- Java设计模式—工厂方法模式抽象工厂模式
工厂方法模式与抽象工厂模式都是设计模式中重要而且常见的模式. 工厂方法模式:定义一个用于创建对象的接口,让子类决定实例化哪一个类.工厂方法使一个类的实例化延迟到其子类. 通用类图如下: 在 ...
- C#设计模式--工厂方法模式
0.C#设计模式-简单工厂模式 设计模式: 工厂方法模式(Factory Method Pattern) 介绍:简单工厂模式是要在工厂类中通过数据来做个决策,在工厂类中的多个类中实例化出来其中一个要用 ...
- 设计模式 - 工厂方法模式 - 基于 Java 实现
常见和工厂有关的设计模式 和工厂相关的设计模式主要有三种,工厂方法模式,抽象工厂模式: 在前面的博客中介绍了简单工厂模式,本篇博客主要介绍的是工厂方法模式 什么是工厂方法模式 工厂方法模式是简单工厂的 ...
最新文章
- 限招2019应届计算机毕业生,2019年计算机专业应届毕业生自我鉴定
- php域名转发,php 域名转发程序
- Pytorch:GAN生成对抗网络实现MNIST手写数字的生成
- a=10a=0C语言,C语言程序设计10A卷试题及答案.doc
- 透明状态栏导致windowSoftInputMode:adjustResize失效问题
- 几张一模一样的照片_两张一模一样的照片看起来却不一样!什么鬼?
- NMath应用教程:如何通过代码访问底层数据和应用函数
- 计算机上没有信任的用户,服务器上的安全数据库没有此工作站信任关系的计算机帐户 解决办法...
- javascript中数组遍历问题
- Linux操作系统——Linux 内核源码介绍内核升级
- LoadRunner基础入门教程
- apple id 如何注册来啦?(亲测流程)
- macos系统怎么取消开机启动项
- python二进制转十进制函数_python基础教程之python基础教程之python进制转换(二进制、十进制...
- 小觅摄像头 VINS-MONO安装
- GPU百科全书(6)谁也离不开的缓冲
- java外卖项目介绍_JavaWeb网上订餐系统项目
- rti matlab,dSPACE-RTI知识介绍.pdf
- wireshark 报文分析心得 -- Identification 使用说明
- 爬虫必备,案例对比 Requests、Selenium、Scrapy 爬虫库!
热门文章
- LeetCode 2. Add Two Numbers--C++,Python解法--面试算法题
- C++ 协程介绍[译]
- 解决报错:tensorflow.python.framework.errors_impl.UnknownError: Failed to get convolution algorithm.
- boot sprint 项目结构_京淘项目03 08.28
- MYSQL5-7版本sql_mode=only_full_group_by问题
- mysql文章浏览计数_高并发文章浏览量计数系统设计
- java基础值java 运行参数,及jvm调优
- swift String
- python实现文件搜索_python实现搜索指定目录下文件及文件内搜索指定关键词的方法...
- 谷歌浏览器扩展程序XDM_请立即更新您的谷歌Chrome浏览器 获取重要的安全补丁程序...