工厂方法模式定义一个接口用于创建对象,让子类决定哪一个类实例.工厂方法,使一类延迟到其子类的实例.

角色:

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”。

分析:

核心工厂类不再负责产品的创建,成为一个抽象工厂角色,使一个类的实例化延迟到其子类,这样进一步抽象化使得工厂方法模式能够使系统在不改动详细工厂角色的情况下引进新的产品。当添加新的算法时,不需更改原有的工厂类,仅仅需添加此功能的运算类和对应的详细生产工厂,仅仅对扩展开放,对改动关闭,弥补了简单工厂的不足,仍保持封装对象创建过程的长处,减少了客户程序与产品对象的耦合。工厂方法的缺点就是每添加一个产品,须要添加这个产品工厂的类,利用反射技术能够进行完好。

小编寄语:通过写博客。加深了理解,沉淀了知识。欢迎大家指点,我们共同进步。

版权声明:本文博主原创文章,博客,未经同意不得转载。

设计模式------工厂方法模式相关推荐

  1. 4. 星际争霸之php设计模式--工厂方法模式

    题记 ============================================================================== 本php设计模式专辑来源于博客(jy ...

  2. java 工厂方法_java设计模式-工厂方法模式

    1.工厂方法(FactoryMethod)模式的定义 定义一个创建产品对象的工厂接口,将产品对象的实际创建工作推迟到具体子工厂类当中.这满足创建型模式中所要求的"创建与使用相分离" ...

  3. 设计模式 | 工厂方法模式及典型应用

    工厂方法模式 工厂方法模式(Factory Method Pattern):定义一个用于创建对象的接口,让子类决定将哪一个类实例化.工厂方法模式让一个类的实例化延迟到其子类. 工厂方法模式又简称为工厂 ...

  4. python工厂模式 django_python设计模式-工厂方法模式

    题目:假设你有一个 pizza 店,功能包括下订单.做 pizza,你的代码会如何写呢? def order_pizza(): pizza = Pizza() pizza.prepare() pizz ...

  5. 工厂方法模式_1天1个设计模式——工厂方法模式

    意图 工厂方法模式是一种创建型设计模式, 其在父类中提供一个创建对象的方法, 允许子类决定实例化对象的类型. 问题 假设你正在开发一款物流管理应用.1.0版本只能支持处理卡车运输,因此大部分的代码都位 ...

  6. [设计模式] ------ 工厂方法模式

    工厂方法模式 手机厂造手机,肥皂厂造肥皂,药品厂造药品. 假设有一大类对象A1,A2,A3,A4-他们都有一个共同的父类A A1可以想成是手机,A2可以想成肥皂- (下面例子的A1Factory就是手 ...

  7. JAVA设计模式 - 工厂方法模式

    工厂方法模式(Factory Pattern) 是一种创建型设计模式 , 它是Java中最常用的设计模式之一 . 1 . 工厂方法模式的定义 定义一个创建对象的接口 , 让子类决定实例化哪一个类 . ...

  8. Java设计模式—工厂方法模式抽象工厂模式

    工厂方法模式与抽象工厂模式都是设计模式中重要而且常见的模式.       工厂方法模式:定义一个用于创建对象的接口,让子类决定实例化哪一个类.工厂方法使一个类的实例化延迟到其子类. 通用类图如下: 在 ...

  9. C#设计模式--工厂方法模式

    0.C#设计模式-简单工厂模式 设计模式: 工厂方法模式(Factory Method Pattern) 介绍:简单工厂模式是要在工厂类中通过数据来做个决策,在工厂类中的多个类中实例化出来其中一个要用 ...

  10. 设计模式 - 工厂方法模式 - 基于 Java 实现

    常见和工厂有关的设计模式 和工厂相关的设计模式主要有三种,工厂方法模式,抽象工厂模式: 在前面的博客中介绍了简单工厂模式,本篇博客主要介绍的是工厂方法模式 什么是工厂方法模式 工厂方法模式是简单工厂的 ...

最新文章

  1. Java 日志框架适配/冲突解决方案(值得收藏)
  2. 北京、广州同时开课 | 临床基因组学数据分析实战助力解析Case,快速发表文章...
  3. iOS功能-统计平均下班时间
  4. 用JS解决图片太大,把网站撑变形的问题
  5. pat 乙级 1036 跟奥巴马一起编程(C++)
  6. 【渝粤教育】电大中专学前儿童健康教育作业 题库
  7. 【干货】python多进程和多线程谁更快
  8. mysql数据库管理工具navicat for mysql怎么用
  9. vbb论坛(vBulletin)后台获取webshell
  10. 关于java实习报告周记_2019年度热门关于java实习报告周记优秀七篇
  11. 云课堂智慧职教答案python_云课堂智慧职教答案表,职教云答案课堂智慧职教答案公众号,云课堂智慧职教答案python...
  12. bittorrent_最好的免费BitTorrent客户
  13. 快来加入木东居士的数据交流群吧~
  14. Day241242.单点登录方案【Jwt令牌、sessionredis、CAS认证服务器】 -springsecurity-jwt-oauth2
  15. Android Canvas rotate 和translate 两个方法的研究
  16. 欧文分校的计算机科学博士,2020年加州大学欧文分校博士含金量
  17. matlab神经网络工具箱实现两个输入的BP神经网络
  18. es6转es5 的6种方式
  19. 为什么这么多的顶尖黑客来自俄罗斯?
  20. 在openssl中对SM2的公私钥进行加解密的验证

热门文章

  1. Python 超快生成大量随机数的方法
  2. java 随机生成常用汉字_Java随机生成中文汉字
  3. php5中魔术方法函数有哪几个,php中的类魔术方法有哪些
  4. linux监测cpu 内存,Linux中CPU与内存性能监测.docx
  5. java事件驱动模型_Spring事件驱动模型详解
  6. 操作系统导论中文版 pdf_一分钟带你认识微软操作系统 Windows 10
  7. o oia ospf 路由优先_动态路由OSPF中注入默认路由,原来都是这么玩的,进去看看...
  8. mysql case设固定值_MySQL CASE语句将自定义值放置为NULL
  9. php 为什么定义常量,php-将预定义常量定义为什么
  10. ubuntu 更新mysql后无法登陆_更新ubuntu之后无法登陆mysql