工厂方法

前面我们学习了简单工厂,发现一个问题就是简单工厂集合了矛盾,为了解决这个问题我们针对每一种产品提供一个工厂类。通过不同的工厂实例来创建不同的产品实例。在同一等级结构中,支持增加任意产品这种设计模式就是工厂方法。

优点:允许系统在不修改具体工厂角色的情况下引进新产品

缺点:由于每加一个产品,就需要加一个产品工厂的类,增加了额外的开发量

     public interface IFactory
{
IRace CreateRace();
}
    public class HumanFactory : IFactory
{
public virtual IRace CreateRace()
{
return new Human();
}
}
public class HumanFactoryAdvanced: HumanFactory
{
public override IRace CreateRace()
{
Console.WriteLine("");
return new Human();
}
}
     public class NEFactory : IFactory
{
public IRace CreateRace()
{
return new NE();
}
}
     public class ORCFactory : IFactory
{
public IRace CreateRace()
{
return new ORC();
}
}
     public class UndeadFactory : IFactory
{
public IRace CreateRace()
{
return new Undead();
}
}

前端调用

                {
Human human = new Human();//1 到处都是细节
}
{
IRace human = new Human();//2 左边是抽象 右边是细节
}
{
//human.
IFactory factory = new HumanFactory();//包一层
IRace race = factory.CreateRace();
//何苦 搞了这么多工厂 还不是创建个对象
//以前依赖的是Human 现在换成了HumanFactory //1 工厂可以增加一些创建逻辑 屏蔽对象实例化的复杂度
//2 对象创建的过程中 可能扩展(尤其是ioc)
}
{
//Undead
IFactory factory = new UndeadFactory();
IRace race = factory.CreateRace();
}

工厂方法:把简单工厂拆分成多个工厂,保证每个工厂的相对稳定
但是要多new一次工厂? 难免,中间层,屏蔽业务类变化的影响,而且可以留下创建对象的扩展空间=>eg:HumanFactoryAdvanced 在创建对象之前执行一些操作

开闭原则:对扩展开发,对修改封闭
工厂方法完美遵循了开闭原则

工厂方法的好处就是对于拓展很方便例如增加第五种族

     /// <summary>
/// 比如构造很复杂。。比如依赖其他对象
/// 屏蔽变化
/// </summary>
public class FiveFactory : IFactory
{
public virtual IRace CreateRace()
{ //return new Five();
return new Five(, "New", );
}
}

前端调用

                {
IRace five = new Five();//修改
} {
//five
IFactory factory = new FiveFactory();
IRace race = factory.CreateRace();
}

简单工厂与工厂方法

工厂方法模式是简单工厂模式的进一步抽象和推广,由于使用了多态性,工厂方法模式保持了简单工厂模式的优点,并且克服了它的缺点,完全符合开闭原则

23种设计模式之工厂方法(Factory Method Pattern)的更多相关文章

  1. 【Unity3D与23种设计模式】工厂方法模式(Factory Method)

    GoF中定义: "定义一个可以产生对象的接口,但是让子类决定要产生哪一个类的对象.工厂方法模式让类的实例化程序延迟到子类中实施" 当类的对象产生时,若出现下列情况: 1.需要复杂的 ...

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

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

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

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

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

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

  5. 二十四种设计模式:工厂方法模式(Factory Method Pattern)

    工厂方法模式(Factory Method Pattern) 介绍定义一个用于创建对象的接口,让子类决定将哪一个类实例化.Factory Method使一个类的实例化延迟到其子类. 示例有SqlMes ...

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

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

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

    定义一个用于创建对象的接口,让子类决定实例化哪一个类.工厂方法使一个类的实例化延迟到其子类. ——DP UML类图 模式说明 抽象业务基类 实际业务类的公共基类,也是工厂要创建的所有对象的父类,这部分 ...

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

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

  9. java23种设计模式之八: 工厂方法模式

    定义: 定义一个创建产品对象的工厂接口,将产品对象的实际创建工作推迟到具体子工厂类当中.这满足创建型模式中所要求的“创建与使用相分离”的特点. 我们把被创建的对象称为“产品”,把创建产品的对象称为“工 ...

随机推荐

  1. Unity之Update与FixedUpdate区别

    下面这段代码演示游戏暂停 using UnityEngine; using System.Collections; public class GamePauseTest : MonoBehaviour ...

  2. 使用css实现水平垂直居中

    1.通过absolute和margin实现(适用于弹窗,具体位置随浏览器屏幕大小变化改变)这种方式需要居中元素的父级必须采用绝对定位或相对定位,被居中元素的尺寸需要固定. <div class= ...

  3. VS Code 配置 Python 开发环境

    1.终端运行 Python2.安装 Python 插件3.查看.安装外部库4.代码补全工具5.代码检查工具5.1.pylint5.2.flake8 和 yapf 本文基于 VS Code 1.36.1 ...

  4. NLP(九) 文本相似度问题

    多个维度判别文本之间相似度 情感维度 Sentiment/Emotion 感官维度 Sense 特定词的出现 词频 TF 逆文本频率 IDF 构建N个M维向量,N是文档总数,M是所有文档的去重词汇量 ...

  5. [python]代码中包含中文,提示:SyntaxError: Non-ASCII character '\xcd'

    解决方法: 把文件编码方式改为gbk即可.在代码开头写上: # coding=gbk

  6. lightoj 1145 - Dice (I)(dp+空间优化+前缀和)

    题目链接:http://www.lightoj.com/volume_showproblem.php?problem=1145 题解:首先只要是dp的值只和上一个状态有关系那么就可以优化一维,然后这题 ...

  7. codeforces 813 D. Two Melodies(dp)

    题目链接:http://codeforces.com/contest/813/problem/D 题意:求两个不相交的子集长度之和最大是多少,能放入同一子集的条件是首先顺序不能变,然后每一个相邻的要么 ...

  8. 使用Elastic APM监控你的.NET Core应用

    作者:Jax 前言 在应用实际的运维过程中,我们需要更多的日志和监控来让我们对自己的应用程序的运行状况有一个全方位的了解.然而对于大部分开发者而言,平时大家所关注的更多的是如何更优雅的实现业务,或者是 ...

  9. hive正则表达式的用法

    regexp_replace用法 1.  截取字符串中的汉字部分: 举个栗子:select regexp_replace('七夕节comming!来啦','([^\\u4E00-\\u9FA5]+)' ...

  10. SQLi_LABS less5: GET-Double Injection - Single Quotes - String

    目录 前言 几种可能的注入方式 补充的相关知识点 前言 最近开始用SQLi_LABS学习注入,刚开始有点摸不到头脑,索性把看到的知识点记录下来,很多细节是看别人博客学的,就直接给链接了,在此向这些作者 ...