在上文(设计模式学习-简单工厂模式)的模拟场景中,我们用简单工厂模式实现了VISA和MASTERARD卡的刷卡处理,系统成功上线并运行良好,突然有一天老大跑来说,我们的系统需要升级,提供对一般银联卡的支持。怎么办?有需求总是要改的,苦B的程序员伤不起啊....

  怎么改?增加一个银联卡处理类?然后在工厂类的静态方法里增加Case处理?前几天刚读了面向对象的核心设计原则-“开放封闭原则”,这样改下去不是完全违背了这个设计原则?

  开放封闭原则(OCP,Open Closed Principle)是所有面向对象原则的核心。软件设计本身所追求的目标就是封装变化、降低耦合,而开放封闭原则正是对这一目标的最直接体现。其他的设计原则,很多时候是为实现这一目标服务的,例如以Liskov替换原则实现最佳的、正确的继承层次,就能保证不会违反开放封闭原则。开放封闭原则,其核心的思想是:软件实体应该是可扩展,而不可修改的。也就是说,对扩展是开放的,而对修改是封闭的

于是,我决定重构之前的简单工厂模式实现的方法,首先我们找出变化点,增加银联卡处理类是不可避免,这属于扩展,对工厂类增加CASE条件的处理,这里属于修改原业务,属于修改,OCP告诉我们,对修改应该是关闭的。

  OK,顺利找到变化点,由于我们不知道将来需要实例化出什么对象,所以将产品工厂抽象出来,让对象的实例化在子类实现:

View Code

abstract class HandleFactory
    {
        public abstract BankCardHandle CreateBankCardHandle();

  接着,我们实现生成VISA及MASTERARD刷卡对象的实际工厂:

View Code

class VisaHandleFactory : HandleFactory 
    {
        public override BankCardHandle CreateBankCardHandle()
        {
            return new VisaHandle();
        }
    }

class MasterCardHandleFactory : HandleFactory
    {
        public override BankCardHandle CreateBankCardHandle()
        {
            return new MasterCardHandle();
        }

BankCardHandle、VisaHandle、MasterCardHandle类见上一篇(设计模式学习-简单工厂模式)。

  不知不觉,我们用工厂方法模式重构了我们的系统,下面我们看看工厂方法模式的介绍。

模式概述:

工厂方法模式又称工厂模式,属于类的创建型模式。在工厂方法模式中,父类负责定义创建对象的公共接口,而子类则负责生成具体的对象,这样做的目的是将类的实例化操作延迟到子类中完成,即由子类决定究竟应该实例化哪一个类。

UML类图:

其中的类或对象之间的关系为:

  • 产品角色(Product)
    定义产品的相关接口。
  • 真实的的产品角色(ConcreteProduct)
    实现接口Product。
  • 工厂角色(Factory)
    声明工厂方法(FactoryMethod),返回一个产品(Product)。
  • 真实的工厂(ConcreteFactory)
    实现FactoryMethod工厂方法,由客户调用,返回一个Product实例。

  经过上面我们用工厂方法模式重构刷卡系统后,老大提出的增加一个银联卡的处理就比较好办了,先增加一个银联卡处理类,同时增加一个生产银联卡处理类的工厂类:

View Code

class UnionPayCardHandle : BankCardHandle
    {
        public override void HandleProcess()
        {
            Console.WriteLine("银联卡处理中");
        }
    }

class UnionPayCardHandleFactory : HandleFactory
    {
        public override BankCardHandle CreateBankCardHandle()
        {
            return new UnionPayCardHandle();
        }

客户端调用代码如下:

View Code

HandleFactory hd = new UnionPayCardHandleFactory();
            BankCardHandle bk = hd.CreateBankCardHandle();

我们以后增加卡处理方式,只需要增加相应的卡处理类和生成卡处理类的工厂,然后修改一下客户端代码就好了,如果连客户端代码都不想修改,在客户端获取配置文件,用反射处理就OK了。

转载于:https://www.cnblogs.com/kdalan/archive/2012/06/01/2531395.html

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

  1. python类是实例的工厂_Python设计模式之工厂方法模式实例详解

    本文实例讲述了Python设计模式之工厂方法模式.分享给大家供大家参考,具体如下: 工厂方法模式(Factory Method Pattern):定义一个用于创建对象的接口,让子类决定实例化哪一个类, ...

  2. 工厂方法模式--结合具体例子学习工厂方法模式

    在学习工厂方法模式之前,可以先学习一下简单工厂模式,网址是http://blog.csdn.net/u012116457/article/details/21650421,这里仍以水果的实例讲解. 先 ...

  3. 设计模式复习-工厂方法模式

     设计模式复习-工厂方法模式 相对于简单工厂,工厂方法是把算法类的实例化延迟到了调用者那去做,调用者根据自己的需要,自己实例化相关的工厂并且生产相关算法.这么做是因为简单工厂是不满足OCP的,因为如果 ...

  4. C#设计模式(3)——工厂方法模式

    一.引言 在简单工厂模式中讲到简单工厂模式的缺点,有一点是--简单工厂模式系统难以扩展,一旦添加新产品就不得不修改简单工厂方法,这样就会造成简单工厂的实现逻辑过于复杂,然而本专题介绍的工厂方法模式可以 ...

  5. 设计模式之工厂方法模式(创建型)

    一.模式定义 工厂方法模式:又称工厂模式,也叫虚拟构造器模式,属于构建型设计模式,工厂方法模式是在简单工厂模式上进行拓展,生产产品的过程由具体工厂类实现,基类只实现接口,这使得工厂方法模式可以在不修改 ...

  6. 设计模式之工厂方法模式应用例题

    设计模式之工厂方法模式应用例题 题目描述 类结构图及相关说明 程序代码 运行结果 题目描述 现需要设计一个程序来读取多种不同类型的图片格式,针对每一种图片格式都设计一个图片读取器(ImageReade ...

  7. 设计模式:工厂方法模式(Factory method)

    设计模式:工厂方法模式(Factory method) 一.问题 在前一章中通过披萨的实例介绍了简单工厂模式.在披萨实例中,如果我想根据地域的不同生产出不同口味的披萨,如纽约口味披萨,芝加哥口味披萨. ...

  8. 【设计模式】工厂方法模式(C#)

    [设计模式]工厂方法模式 1.概述 针对简单工厂中的缺点,使用工厂方法模式就可以完美的解决,完全遵循开闭原则. 定义一个用于创建对象的接口,让子类决定实例化哪个产品类对象.工厂方法使一个产品类的实例化 ...

  9. 一文叫你弄懂Java设计模式之工厂方法模式:图解+日志记录器代码实例

    文章目录 详解Java设计模式之工厂方法模式 案例引入工厂方法模式 工厂方法模式 定义 案例分析 UML类图分析 代码分析 工厂方法的重载 工厂方法的隐藏 模式优点 模式缺点 模式适用环境 详解Jav ...

  10. 设计模式之工厂方法模式学习笔记

    定义 定义一个用于创建对象的接口,让子类去决定是实现哪个类.工厂方法使类的实例化,延迟到了子类. 结构图 角色拆解分析: 1.Product:抽象产品类 2.ConcrereProduct:具体产品类 ...

最新文章

  1. DPDK pmd驱动初始化(十九)
  2. 哈,你猜一个 TCP 连接上面能发多少个 HTTP 请求?
  3. java 高并发第三阶段实战_Java 高并发第三阶段实战---Java并发包深入解析与使用详解...
  4. 自己动手制作一门语言(1)波罗语
  5. 网优测试软件p,网优到底是干啥的?
  6. java把秒时长转换为分钟_java - 将秒值转换为小时分钟秒?
  7. GB50174《电子信息系统机房设计规范》福州再掀培训热潮
  8. 利用OBS推流抖音直播电脑屏幕或PC游戏
  9. redis基础篇——数据一致性
  10. 开水团2023届实习笔试
  11. js控制的回到顶端goTop的使用
  12. 【Algorithm】一般约束优化问题——PHR算法及其Matlab实现
  13. 在服务器 和 虚拟机中 查看代码 samba source insight
  14. Python 给图片上加文字
  15. 给大学同窗的6个建议
  16. f4在计算机中的作用,F4键原来这么神奇!F4在办公时的妙用你知多少
  17. 图文并茂,Python轻松生成PDF数据分析报告
  18. 区块链共享数据架构设计
  19. ubuntu 编译android SDK错误处理
  20. 『Others』一键关闭所有应用程序

热门文章

  1. 【数据分析学习】线性降维方法
  2. python tkinter教程 博客园_python tkinter教程-事件绑定
  3. LeetCode Hot100 ---- 动态规划专题
  4. [深度学习] 分布式Pytorch介绍(三)
  5. Bash Shell学习笔记五
  6. rasa聊天机器人_Rasa-X是持续改进聊天机器人的独特方法
  7. 如何在不亏本的情况下构建道德数据科学系统?
  8. 数据集准备及数据预处理_1.准备数据集
  9. linux i2c编程
  10. kaggle使用笔记