工厂方法

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

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

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

     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. Java IO体系之File类浅析

    Java IO体系之File类浅析 一.File类介绍 位于java.io下的Java File类以抽象的方式代表文件名和目录路径名.该类主要用于文件和目录的创建.文件的查找和文件的删除等.File对 ...

  2. Delphi - cxGrid添加Footer显示

    cxGrid - 添加footer显示 1:添加Footer Items 单击cxGrid Customize... ,Summary,Add: 2:添加Footer items数据绑定 选中一条需要 ...

  3. 在windows7系统下如何查看及升级powershell到3.0版本

    最近在学习.net core web api 开发,用到了Mysql.Data.EntityFrameworkCore框架,在根据数据库表生成对应实体类时提示必须先升级本机powershell到3.0 ...

  4. java设计模式9.备忘录模式、访问者模式、调停者模式

    备忘录模式 备忘录模式又叫快照模式,备忘录对象是一个用来存储另外一个对象内部状态快照的对象.备忘录的用意是在不破坏封装的条件下,将一个对象的状态捕捉,并外部化存储起来,从而可以在将来合适的时候把这个对 ...

  5. Java NIO 上

    概述: NIO主要有三大核心部分:Channel(通道),Buffer(缓冲区), Selector. 传统IO基于字节流和字符流进行操作,而NIO基于Channel和Buffer(缓冲区)进行操作, ...

  6. list 分批

    public class TestList { public static void main(String[] args){ List<Integer> list = new Array ...

  7. CF - 652 D Nested Segments

    题目传送门 题解: 可以将所有线段按照左端点优先小,其次右端点优先大进行排序. 然后对于第 i 条线段来说, 那么第 i+1 ---- n 的线段左端点都一定在第i条线段的右边, 接下来就需要知道 i ...

  8. CodeForces 980 C Posterized

    Posterized 题意:将[0,255] 分成 若干段, 每一段的长度最多为k, 每一个数只能被放进一个段里, 然后每一段的数组都可以被这一段最小的数字表示, 求最小的字典序. 题解:每次一个访问 ...

  9. odoo12从零开始:三、1)创建你的第一个应用模型(module)

    前言 以前,我一直都不知道为什么好多框架的入门都是“hello world”开始,当我思前想后我要如何介绍odoo的model.record.template等继承等高级特性时,发现在那之前便需要清楚 ...

  10. 如何在 Ubuntu 上安装 MongoDB

    MongoDB 是一个越来越流行的自由开源的 NoSQL 数据库,它将数据存储在类似 JSON 的灵活文档集中,这与 SQL 数据库中常见的表格形式形成对比. 你很可能发现在现代 Web 应用中使用 ...