设计模式学习-工厂方法模式
在上文(设计模式学习-简单工厂模式)的模拟场景中,我们用简单工厂模式实现了VISA和MASTERARD卡的刷卡处理,系统成功上线并运行良好,突然有一天老大跑来说,我们的系统需要升级,提供对一般银联卡的支持。怎么办?有需求总是要改的,苦B的程序员伤不起啊....
怎么改?增加一个银联卡处理类?然后在工厂类的静态方法里增加Case处理?前几天刚读了面向对象的核心设计原则-“开放封闭原则”,这样改下去不是完全违背了这个设计原则?
于是,我决定重构之前的简单工厂模式实现的方法,首先我们找出变化点,增加银联卡处理类是不可避免,这属于扩展,对工厂类增加CASE条件的处理,这里属于修改原业务,属于修改,OCP告诉我们,对修改应该是关闭的。
OK,顺利找到变化点,由于我们不知道将来需要实例化出什么对象,所以将产品工厂抽象出来,让对象的实例化在子类实现:
{
public abstract BankCardHandle CreateBankCardHandle();
接着,我们实现生成VISA及MASTERARD刷卡对象的实际工厂:
{
public override BankCardHandle CreateBankCardHandle()
{
return new VisaHandle();
}
}
class MasterCardHandleFactory : HandleFactory
{
public override BankCardHandle CreateBankCardHandle()
{
return new MasterCardHandle();
}
不知不觉,我们用工厂方法模式重构了我们的系统,下面我们看看工厂方法模式的介绍。
模式概述:
UML类图:
其中的类或对象之间的关系为:
- 产品角色(Product)
定义产品的相关接口。 - 真实的的产品角色(ConcreteProduct)
实现接口Product。 - 工厂角色(Factory)
声明工厂方法(FactoryMethod),返回一个产品(Product)。 - 真实的工厂(ConcreteFactory)
实现FactoryMethod工厂方法,由客户调用,返回一个Product实例。
经过上面我们用工厂方法模式重构刷卡系统后,老大提出的增加一个银联卡的处理就比较好办了,先增加一个银联卡处理类,同时增加一个生产银联卡处理类的工厂类:
{
public override void HandleProcess()
{
Console.WriteLine("银联卡处理中");
}
}
class UnionPayCardHandleFactory : HandleFactory
{
public override BankCardHandle CreateBankCardHandle()
{
return new UnionPayCardHandle();
}
客户端调用代码如下:
BankCardHandle bk = hd.CreateBankCardHandle();
我们以后增加卡处理方式,只需要增加相应的卡处理类和生成卡处理类的工厂,然后修改一下客户端代码就好了,如果连客户端代码都不想修改,在客户端获取配置文件,用反射处理就OK了。
转载于:https://www.cnblogs.com/kdalan/archive/2012/06/01/2531395.html
设计模式学习-工厂方法模式相关推荐
- python类是实例的工厂_Python设计模式之工厂方法模式实例详解
本文实例讲述了Python设计模式之工厂方法模式.分享给大家供大家参考,具体如下: 工厂方法模式(Factory Method Pattern):定义一个用于创建对象的接口,让子类决定实例化哪一个类, ...
- 工厂方法模式--结合具体例子学习工厂方法模式
在学习工厂方法模式之前,可以先学习一下简单工厂模式,网址是http://blog.csdn.net/u012116457/article/details/21650421,这里仍以水果的实例讲解. 先 ...
- 设计模式复习-工厂方法模式
设计模式复习-工厂方法模式 相对于简单工厂,工厂方法是把算法类的实例化延迟到了调用者那去做,调用者根据自己的需要,自己实例化相关的工厂并且生产相关算法.这么做是因为简单工厂是不满足OCP的,因为如果 ...
- C#设计模式(3)——工厂方法模式
一.引言 在简单工厂模式中讲到简单工厂模式的缺点,有一点是--简单工厂模式系统难以扩展,一旦添加新产品就不得不修改简单工厂方法,这样就会造成简单工厂的实现逻辑过于复杂,然而本专题介绍的工厂方法模式可以 ...
- 设计模式之工厂方法模式(创建型)
一.模式定义 工厂方法模式:又称工厂模式,也叫虚拟构造器模式,属于构建型设计模式,工厂方法模式是在简单工厂模式上进行拓展,生产产品的过程由具体工厂类实现,基类只实现接口,这使得工厂方法模式可以在不修改 ...
- 设计模式之工厂方法模式应用例题
设计模式之工厂方法模式应用例题 题目描述 类结构图及相关说明 程序代码 运行结果 题目描述 现需要设计一个程序来读取多种不同类型的图片格式,针对每一种图片格式都设计一个图片读取器(ImageReade ...
- 设计模式:工厂方法模式(Factory method)
设计模式:工厂方法模式(Factory method) 一.问题 在前一章中通过披萨的实例介绍了简单工厂模式.在披萨实例中,如果我想根据地域的不同生产出不同口味的披萨,如纽约口味披萨,芝加哥口味披萨. ...
- 【设计模式】工厂方法模式(C#)
[设计模式]工厂方法模式 1.概述 针对简单工厂中的缺点,使用工厂方法模式就可以完美的解决,完全遵循开闭原则. 定义一个用于创建对象的接口,让子类决定实例化哪个产品类对象.工厂方法使一个产品类的实例化 ...
- 一文叫你弄懂Java设计模式之工厂方法模式:图解+日志记录器代码实例
文章目录 详解Java设计模式之工厂方法模式 案例引入工厂方法模式 工厂方法模式 定义 案例分析 UML类图分析 代码分析 工厂方法的重载 工厂方法的隐藏 模式优点 模式缺点 模式适用环境 详解Jav ...
- 设计模式之工厂方法模式学习笔记
定义 定义一个用于创建对象的接口,让子类去决定是实现哪个类.工厂方法使类的实例化,延迟到了子类. 结构图 角色拆解分析: 1.Product:抽象产品类 2.ConcrereProduct:具体产品类 ...
最新文章
- DPDK pmd驱动初始化(十九)
- 哈,你猜一个 TCP 连接上面能发多少个 HTTP 请求?
- java 高并发第三阶段实战_Java 高并发第三阶段实战---Java并发包深入解析与使用详解...
- 自己动手制作一门语言(1)波罗语
- 网优测试软件p,网优到底是干啥的?
- java把秒时长转换为分钟_java - 将秒值转换为小时分钟秒?
- GB50174《电子信息系统机房设计规范》福州再掀培训热潮
- 利用OBS推流抖音直播电脑屏幕或PC游戏
- redis基础篇——数据一致性
- 开水团2023届实习笔试
- js控制的回到顶端goTop的使用
- 【Algorithm】一般约束优化问题——PHR算法及其Matlab实现
- 在服务器 和 虚拟机中 查看代码 samba source insight
- Python 给图片上加文字
- 给大学同窗的6个建议
- f4在计算机中的作用,F4键原来这么神奇!F4在办公时的妙用你知多少
- 图文并茂,Python轻松生成PDF数据分析报告
- 区块链共享数据架构设计
- ubuntu 编译android SDK错误处理
- 『Others』一键关闭所有应用程序