设计模式——工厂方法(Factory Method)
定义一个用于创建对象的接口,让子类决定实例化哪一个类。工厂方法使一个类的实例化延迟到其子类。
——DP
UML类图

模式说明
抽象业务基类
实际业务类的公共基类,也是工厂要创建的所有对象的父类,这部分同简单工厂。在这里是一个计算基类,定义了两个参数和一个抽象的计算方法:
/// <summary>
/// 计算基类
/// </summary>
abstract class Operation
{
public double NumberA { get; set; }
public double NumberB { get; set; } public abstract double GetResult();
}
有了抽象的业务基类,那么要根据实现业务来实现具体的业务子类。这里是具体计算方法的各种实现:
/// <summary>
/// 加法运算
/// </summary>
class OperationAdd:Operation
{
public override double GetResult()
{
return NumberA + NumberB;
}
}
/// <summary>
/// 减法运算
/// </summary>
class OperationSub : Operation
{
public override double GetResult()
{
return NumberA - NumberB;
}
}
工厂类
由于简单工厂,在工厂类中存在大量的if...else或switch...case判断语句,在添加新业务类的时候,还是需要修改工厂类(添加新的判断语句)才能实现,这就违背了一条重要的设计原则——开闭原则。所以工厂方法模式中,将这些判断逻辑抽象出来,抽象成一个创建业务类的接口(即定义中的“定义一个用于创建对象的接口”),然后由具体的工厂子类来创建各自的业务对象。
计算工厂类抽象出的统一接口:
/// <summary>
/// 计算工厂类接口
/// </summary>
interface IOperationFactory
{
Operation CreateOperation();
}
具体的计算工厂类(创建各自的业务对象):
/// <summary>
/// 加法运算工厂
/// </summary>
class OperationAddFactory:IOperationFactory
{
public Operation CreateOperation()
{
return new OperationAdd();
}
}
/// <summary>
/// 减法运算工厂
/// </summary>
class OperationSubFactory:IOperationFactory
{
public Operation CreateOperation()
{
return new OperationSub();
}
}
这样设计后,客户端只要根据需要,实例化一个具体的计算工厂,然后用工厂生成业务对象,就可以进行计算了:
IOperationFactory factory = new OperationAddFactory();
Operation op = factory.CreateOperation(); op.NumberA = ;
op.NumberB = ;
double result = op.GetResult();
总结
工厂方法模式是对简单工厂模式中的工厂类,进行了面向对象的重构。使其在面对变化时,不需要修改工厂类里的判断逻辑,而是通过扩展(添加新的业务类和工厂类)来完成,这就使得工厂类的设计也完全符合开闭原则了。
参考
- 程杰老师 《大话设计模式》
设计模式——工厂方法(Factory Method)的更多相关文章
- 抽象工厂(Abstract Factory),工厂方法(Factory Method),单例模式(Singleton Pattern)
在谈工厂之前,先阐述一个观点:那就是在实际程序设计中,为了设计灵活的多态代码,代码中尽量不使用new去实例化一个对象,那么不使用new去实例化对象,剩下可用的方法就可以选择使用工厂方法,原型复制等去实 ...
- Spring 通过工厂方法(Factory Method)来配置bean
Spring 通过工厂方法(Factory Method)来配置bean 在Spring的世界中, 我们通常会利用bean config file 或者 annotation注解方式来配置bean. ...
- [设计模式-创建型]工厂方法(Factory Method)
概括 名称 Factory Method 结构 动机 定义一个用于创建对象的接口,让子类决定实例化哪一个类.Factory Method 使一个类的实例化延迟到其子类. 适用性 当一个类不知道它所必 ...
- 设计模式二: 工厂方法(Factory Method)
简介 工厂方法模式是创建型模式的一种, 核心结构有四个角色: 抽象工厂,具体工厂,抽象产品,具体产品; 实现层面上,该模式定义一个创建产品的接口,将实际创建工作推迟到具体工厂类实现, 一个产品对应一个 ...
- Headfirst设计模式的C++实现——工厂方法(Factory Method)
引用原书的一句话:所有的工厂模式都用来封装对象的创建,工厂方法模式通过让子类决定该创建的对象是什么来达到封装的目的. Pizza类及其派生类与上一例相同 PizzaStore.h #ifndef _P ...
- 工厂方法 Factory Method
背景:有一个应用框架,它可以向用户显示多个文档.在这个框架中,两个主要的抽象是类Application和Document.这两个类都是抽象的.客户必须通过它们的子类来做与举替应用相关的实现. 分析:因 ...
- 设计模式——工厂模式(Factory Method)
工厂方法模式,定义一个用于创建对象的接口,让子类决定实例化哪个类.工厂方法使一个类的实例化延迟到其子类. UML图: 运算基类: package com.cnblog.clarck; /** * 数据 ...
- 设计模式学习心得<工厂方法 Factory Method>
概述 意图 业务代码中常常有构造对象的过程,它拥有大量的参数.并且有很多地方需要这对象. 简化对象构造过程. 主要解决 一个类在不同场景的频繁地创建,让不同对象的创建更有语义化,提高代码复用性. 何时 ...
- Java设计模式-工厂方法模式(Virtual Constructor/Polymorphic Factory)
工厂方法模式(Virtual Constructor/Polymorphic Factory) 工厂方法模式是类的创建模式,又叫做虚拟构造子模式(Virtual Constructor)或者多态性工厂 ...
随机推荐
- shader学习推荐
<DirectX 9.0 3D游戏开发编程基础> 当您理解了如何实现顶点着色器和像素着色器之后,接下来您可能想进一步了解使用这两种着色器能够实现哪些效果. 最好的方式就是研究一下现有的各种 ...
- iOS使用NSURLSession发送POST请求,后台无法接受到请求过来的参数
iOS中发送POST请求,有时需要设置Content-Type,尤其是上传图片的时候. application/x-www-form-urlencoded: 窗体数据被编码为名称/值对.这是标准的编码 ...
- 反编译工具Reflector下载(集成FileGenerator和FileDisassembler)
Reflector是一款比较强大的反编译工具,相信很多朋友都用过它,但reflector本身有很多局限性, 比如只能一个一个的查看方法等,但幸好reflector支持插件功能目前网上有很多reflec ...
- cloudera上面安装Spark2.0
Cloudera默认值是提供Spark1.6的安装,下面介绍如何来安装spark2.1 1. csd包:http://archive.cloudera.com/spark2/csd/ 2. parce ...
- linux->windows主动推送文件同步目录数据 linux-windows数据目录同步
1 .windows下安装openssh for windows工具,下载地址 https://www.mls-software.com/opensshd.html 2.修改openssh安装目录下e ...
- doxygen+ graphviz 开源工具生成源码调用树的wiki
当拿到一含有大量代码的工程怎么看?!这时一个好的代码分析工具非常有用,网上有很多开源工具,但资料都参差不齐,偶然发现doxygen+ graphviz这两工具非常棒,使用工具直接生成函数调用链图,帮助 ...
- 打开*.gd文件的方法
问题来了: 你可能会收到*.gd的公文,那么一般的阅读器都打不开…… 解决方法: 使用书生阅读器(三合一版)来打开 地址:http://www.du8.com/download/index.html
- git branch简单使用
1,branch的建立及使用git clone user@192.168.0.136:/media/projiect/omap4/nexttab/kernel kernel/android3.0/ ...
- HDU 3400 Line belt (三分嵌套)
题目链接 Line belt Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)To ...
- 浅析C#中的事件
讲过了委托,不得不讲事件. 事件基于委托,为委托提供了一种发布/订阅机制. 在发生其他类或对象关注的事情时,类或对象可通过事件通知它们.发送(或引发)事件的类称为“发行者”,接收(或处理)事件的类称为 ...