设计模式——工厂方法(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)或者多态性工厂 ...
随机推荐
- 2017.10.5北京清北综合强化班DAY5
拼不出的数lost.in/.out/.cpp[问题描述]3 个元素的集合{5, 1,2} 的所有子集的和分别是0,1, 2, 3, 5, 6, 7, 8.发现最小的不能由该集合子集拼出的数字是4.现在 ...
- C#中如何获取一个二维数组的两维长度,即行数和列数?以及多维数组各个维度的长度?
如何获取二维数组中的元素个数呢? int[,] array = new int[,] {{1,2,3},{4,5,6},{7,8,9}};//定义一个3行3列的二维数组int row = array. ...
- HDOJ1075字典翻译(map应用)
#include<iostream> #include<cstdio> #include<map> #include<string> #include& ...
- MongoDB之二基础入门(window/linux安装启动)
mongodb中有三元素:数据库,集合,文档,其中“集合”就是对应关系数据库中的“表”,“文档”对应“行”. 一window安装与启动 一. 下载 上MongoDB官网 ,下载页面:https://w ...
- Nmap几个常用的参数
Nmap扫描端口的6种状态: open:端口是开放的 closed:端口是关闭的 filtered:端口被防火墙IDS/IPS屏蔽,无法确定其状态 unfiltered:端口没有被屏蔽,但要进一步确定 ...
- 17_点击事件第四种写法_布局文件添加onclick属性
尽量不要用第四种点击事件的写法.在一万多行代码中发现了一个没被调用的代码 public void call(View v){//第四种写法参数一定是View v //public void call( ...
- 【总结整理】JQuery基础学习---DOM篇
前言: 先介绍下需要用到的浏览器提供的一些原生的方法(这里不处理低版本的IE兼容问题) 创建流程比较简单,大体如下: 创建节点(常见的:元素.属性和文本) 添加节点的一些属性 加入到文档中 流程中涉及 ...
- 获取剪切板上DataFormats.Dib格式的文件
if (formats.Contains(System.Windows.Forms.DataFormats.Dib)) { using (var img = System.Windows.Forms. ...
- windows下primer3-py安装
primer3是由怀特黑德生物医学研究所Steve Rozen等人发起的一个自动寡核苷酸分析和设计的开源项目,被广泛应用在分子生物领域.primer3-py是用python语言封装的primer3的A ...
- 【msyql_获取时间的前后几天函数date_sub】
select now()-- 2017-05-16 16:48:02select curdate() -- 2017-05-16 select curdate() + 1 -- 20170517 s ...