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

——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();

总结

工厂方法模式是对简单工厂模式中的工厂类,进行了面向对象的重构。使其在面对变化时,不需要修改工厂类里的判断逻辑,而是通过扩展(添加新的业务类和工厂类)来完成,这就使得工厂类的设计也完全符合开闭原则了。

参考

  1. 程杰老师  《大话设计模式》

设计模式——工厂方法(Factory Method)的更多相关文章

  1. 抽象工厂(Abstract Factory),工厂方法(Factory Method),单例模式(Singleton Pattern)

    在谈工厂之前,先阐述一个观点:那就是在实际程序设计中,为了设计灵活的多态代码,代码中尽量不使用new去实例化一个对象,那么不使用new去实例化对象,剩下可用的方法就可以选择使用工厂方法,原型复制等去实 ...

  2. Spring 通过工厂方法(Factory Method)来配置bean

    Spring 通过工厂方法(Factory Method)来配置bean 在Spring的世界中, 我们通常会利用bean config file 或者 annotation注解方式来配置bean. ...

  3. [设计模式-创建型]工厂方法(Factory Method)

    概括 名称 Factory Method 结构 动机 定义一个用于创建对象的接口,让子类决定实例化哪一个类.Factory Method 使一个类的实例化延迟到其子类. 适用性 当一个类不知道它所必 ...

  4. 设计模式二: 工厂方法(Factory Method)

    简介 工厂方法模式是创建型模式的一种, 核心结构有四个角色: 抽象工厂,具体工厂,抽象产品,具体产品; 实现层面上,该模式定义一个创建产品的接口,将实际创建工作推迟到具体工厂类实现, 一个产品对应一个 ...

  5. Headfirst设计模式的C++实现——工厂方法(Factory Method)

    引用原书的一句话:所有的工厂模式都用来封装对象的创建,工厂方法模式通过让子类决定该创建的对象是什么来达到封装的目的. Pizza类及其派生类与上一例相同 PizzaStore.h #ifndef _P ...

  6. 工厂方法 Factory Method

    背景:有一个应用框架,它可以向用户显示多个文档.在这个框架中,两个主要的抽象是类Application和Document.这两个类都是抽象的.客户必须通过它们的子类来做与举替应用相关的实现. 分析:因 ...

  7. 设计模式——工厂模式(Factory Method)

    工厂方法模式,定义一个用于创建对象的接口,让子类决定实例化哪个类.工厂方法使一个类的实例化延迟到其子类. UML图: 运算基类: package com.cnblog.clarck; /** * 数据 ...

  8. 设计模式学习心得<工厂方法 Factory Method>

    概述 意图 业务代码中常常有构造对象的过程,它拥有大量的参数.并且有很多地方需要这对象. 简化对象构造过程. 主要解决 一个类在不同场景的频繁地创建,让不同对象的创建更有语义化,提高代码复用性. 何时 ...

  9. Java设计模式-工厂方法模式(Virtual Constructor/Polymorphic Factory)

    工厂方法模式(Virtual Constructor/Polymorphic Factory) 工厂方法模式是类的创建模式,又叫做虚拟构造子模式(Virtual Constructor)或者多态性工厂 ...

随机推荐

  1. MySQL5.7出现Your password has expired. To log in you must change it using a client that supports expir

    今天晚上本来想写bootstrap-fileinput插件集成fastdfs的文章,但是刚启动idea里面的QiYuAdmin就出现了错误: Your password has expired. To ...

  2. HDOJ1059(多重背包)

    1.解法一:多重背包 #include<iostream> #include<cstdio> using namespace std; #define MAX(a,b) (a& ...

  3. Hibernate Validator--创建自己的约束规则

    尽管Bean Validation API定义了一大堆标准的约束条件, 但是肯定还是有这些约束不能满足我们需求的时候, 在这种情况下, 你可以根据你的特定的校验需求来创建自己的约束条件. 3.1. 创 ...

  4. css基础知识二

    1.盒模型: 实际宽度:外边距*2+内边距*2+边框*2+内容宽度(注意这点,可解决界面元素轻微浮动问题,如hover有边框,以前没的时候会有轻微浮动) 作用:他规定了网页元素如何显示以及其相互关系 ...

  5. 十二:JAVA I/O

     输入模式                                                          输出模式 ⑴字节输入流:InputStream ⑵字节输出流:Output ...

  6. WCF服务用户名密码访问

    有2种方式, 第一直接在程序中指定用户名密码,配置调用 private void BtnSearch_Click(object sender, EventArgs e) { try { var cli ...

  7. linux命令-bzip2压缩

    gzip和bzip2 都是压缩命令  区别是压缩算法不一样  一般bzip2压缩的效率高  都不能压缩目录 bzip2 压缩 [root@wangshaojun ~]# bzip2 install.l ...

  8. webStorage

    1.HTML5中的本地存储概念是什么? 很多时候我们会存储用户本地信息到电脑上,例如:比方说用户有一个填充了一半的长表格,然后突然网络连接断开了,这样用户希望你能存储这些信息到本地,当网络恢复的时候, ...

  9. .clearfix:after

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  10. Flask15 远程开发环境搭建、安装虚拟机、导入镜像文件、创建开发环境、pycharm和远程开发环境协同工作

    1 安装VM虚拟机 待更新... 2 导入镜像文件 待更新... 3 启动虚拟机 4 远程连接虚拟机 4.1 安装xShell软件 待更新... 4.2 创建一个新的连接 4.2.1 在虚拟机中获取虚 ...