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

分析:因为被实例化的特定Document子类是与特定应用相关的,所iApplication类不可能预测到那个Document子类将被实例化一一Application类仅直到一个新的文档何时应被创建,而不知道哪一种Document将被创建。这就产生了一个尴尬的局面框架必须实例化类,但是它只知道不能被实例化的抽象类。
延迟实例化一一工厂方法:

工厂方法模式定义了一个创建对象的接口,但由子类决定要实例化的类是哪一个。工厂方法让类把实例化推迟到子类。

需求:使用框架开发一款Word应用程序。

 1 namespace FactoryMethod
 2 {
 3     /// <summary>
 4     /// 文档抽象类,定义了文档的一般操作接口
 5     /// </summary>
 6     public abstract class Document
 7     {
 8         public abstract void Open();
 9         public abstract void Close();
10         public abstract void Save();
11         public abstract void Revert();
12     }
13
14 }

 1 namespace FactoryMethod
 2 {
 3     /// <summary>
 4     /// 文档生产工厂,定义了生产文档的接口
 5     /// </summary>
 6     public abstract  class Application
 7     {
 8         public abstract Document CreateDocument();
 9
10     }
11 }

using System;namespace FactoryMethod
{public class Word:Document{public override void Close(){Console.WriteLine("关闭了一个Word文档");}public override void Open(){Console.WriteLine("打开了一个Word文档");}public override void Revert(){Console.WriteLine("恢复了一个Word文档");}public override void Save(){Console.WriteLine("保存了一个Word文档");}}
}

 1 namespace FactoryMethod
 2 {
 3     public class WordApp : Application
 4     {
 5         public override Document CreateDocument()
 6         {
 7             return new Word();
 8         }
 9     }
10 }

 1 using System;
 2
 3 namespace FactoryMethod
 4 {
 5     class Program
 6     {
 7         static void Main(string[] args)
 8         {
 9             Application app = new WordApp();
10             Document doc = app.CreateDocument();
11             doc.Open();
12             doc.Revert();
13             doc.Save();
14             doc.Close();
15             Console.ReadKey();
16         }
17     }
18 }

运行结果:

新的需求:使用现有框架再开发一款Excel和PowerPoint应用程序。

分析:方法一:分别增加对应的工厂子类和产品子类即可。

方法二:参数化工厂,根据工厂接收的不同参数,返回不同的产品。(本人比较懒,这种方法要修改很现有多代码,放弃)

方法三:使用泛型。

这里我就采用泛型了,泛型的好处是不言而喻的,一次编写,永久使用,再多的产品使用这一个模板工厂就可以了。而且也不需要改变原有代码。

 1 namespace FactoryMethod
 2 {
 3     public class App<T> : Application where T : Document,new()
 4     {
 5         public override Document CreateDocument()
 6         {
 7             return new T();
 8         }
 9     }
10 }

 1 using System;
 2
 3 namespace FactoryMethod
 4 {
 5     class Excel:Document
 6     {
 7         public override void Close()
 8         {
 9             Console.WriteLine("关闭了一个Excel文档");
10         }
11
12         public override void Open()
13         {
14             Console.WriteLine("打开了一个Excel文档");
15         }
16
17         public override void Revert()
18         {
19             Console.WriteLine("恢复了一个Excel文档");
20         }
21
22         public override void Save()
23         {
24             Console.WriteLine("保存了一个Excel文档");
25         }
26     }
27 }

 1 using System;
 2 namespace FactoryMethod
 3 {
 4    public class PPT:Document
 5     {
 6         public override void Close()
 7         {
 8             Console.WriteLine("关闭了一个PPT文档");
 9         }
10
11         public override void Open()
12         {
13             Console.WriteLine("打开了一个PPT文档");
14         }
15
16         public override void Revert()
17         {
18             Console.WriteLine("恢复了一个PPT文档");
19         }
20
21         public override void Save()
22         {
23             Console.WriteLine("保存了一个PPT文档");
24         }
25     }
26 }

运行结果:

参考资料《Design Patterns》

转载于:https://www.cnblogs.com/blackteeth/p/10217509.html

工厂方法 Factory Method相关推荐

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

    在spring的世界中, 我们通常会利用bean config file 或者 annotation注解方式来配置bean. 在第一种利用bean config file(spring xml)方式中 ...

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

    模式定义 定义一个用于创建对象的接口,让子类决定实例化哪一个类,使得一个类的实例化延迟到子类 类图 应用场景 1.当你不知道该使用对象的确切类型的时候: 2.当你希望为库或框架提供扩展其内部组件的方法 ...

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

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

  4. Java工厂方法---Factory Method

    工厂方法:定义一个用于创建对象的接口,让子类决定实例化哪一个类,工厂方法使一个类的实例化延迟到其子类 工厂方法优点: 1.支持OCP原则,开闭原则,把创建产品的细节隐藏起来,对上层类的调用时透明的 2 ...

  5. php factory interface,【PHP 設計模式大頭菜】工廠方法 Factory Method

    工廠方法 Factory Method 工廠方法,跟抽象工廠有點像,可是又沒那麼像,抽象工廠的工廠會有個抽象類別,並且把工廠要做且會重工的事情寫在抽象類別當中,而工廠方法則是需要定義一個工廠介面,並且 ...

  6. 当Android遇上设计模式之工厂方法(Factory)模式

    文章目录 1. 简单工厂模式 2.1 定义 2.2 代码实现 2.3 使用场景 2. 工厂方法模式 2.1 定义 2.2 代码实现 2.3 使用场景 设计模式六大原则: 单一职责原则:就一个类仅有一个 ...

  7. 工厂方法模式(Factory Method)简介

    工厂方法模式 名字 跟已经介绍的 简单工厂模式很类似. 实际上它们的模型也是十分相似的. 我们先看看工厂模式的定义. 一. 工厂方法(Factory Method)模式定义 教材上是这样写的: 工厂方 ...

  8. 【设计模式】工厂方法模式 Factory Method Pattern

    在简单工厂模式中产品的创建统一在工厂类的静态工厂方法中创建,体现了面形对象的封装性,客户程序不需要知道产品产生的细节,也体现了面向对象的单一职责原则(SRP),这样在产品很少的情况下使用起来还是很方便 ...

  9. 工厂方法(Factory Method)

    能够弥补simple factory的不足 将类的实例化(具体产品的创建)延迟到工厂类的子类(具体工厂)中完成,有子类决定应实例化哪个类. 角色: (1) Product(抽象产品):它是定义产品的接 ...

最新文章

  1. Ceilometer Polling Performance Improvement
  2. [IIS]修改MaxFieldLength与MaxRequestBytes彻底解决Request Too Long的问题
  3. springMVC,mybatis配置事务
  4. 边工作边刷题:70天一遍leetcode: day 98
  5. 一步步学习微软InfoPath2010和SP2010--第八章节--使用InfoPath表单Web部件
  6. oracle sql 分区查询语句_Oracle 分区概述
  7. qt connect函数_Qt 串口上位机开发Rice 上位机 学习开发
  8. iOS-获取通讯录信息
  9. C语言显示系统时间的几个办法
  10. 谷粒商城:跨域问题解决
  11. 正余弦变换、和差、倍角公式
  12. 匈牙利命名法为何被淘汰_体育午报:15年魔咒破除!国足淘汰赛终迎一胜
  13. Mac解决docker kubernetes一直starting
  14. QT Creator 应用程序*.exe文件打包发布详细教程【绿色便携形式 和 安装包形式】
  15. 正则表达式在线测试通过,java运行通不过
  16. 曙光服务器重装系统centos7.9
  17. DEVOPS架构师 -- 05从零开始构建基于Kubernetes的DevOps平台
  18. 阿里P8亲自教你!Android高级工程师进阶学习,全套教学资料
  19. 苹果自研处理器搭载全新MacBook 价格更亲民
  20. 2022年7月份模拟考题解答

热门文章

  1. java有几种变量_java有多少种变量?java类变量怎么使用?
  2. 机器人 瓷砖墙面清洗_墙壁清洁机器人解析
  3. 计算机组成原理知识点白中英,计算机组成原理重点整理(白中英版) 考试必备
  4. 抓球球的机器人应该怎么玩_王者荣耀:在游戏中当自己优势队友劣势的时候应该怎么玩?...
  5. python问题解决了吗_Python 问题怎么解决?
  6. Android Studio Gradle输出信息乱码
  7. java 新建 api 案列_Java利用webservice创建接口案例源码
  8. 云麦体脂秤华为体脂秤_华为、小米和有品体脂秤哪个品牌好?三款智能体脂秤横评结果排行...
  9. LeetCode算法入门- Roman to Integer Integer to Roman -day8
  10. horizon client 无法识别域_iText for Mac(OCR识别图中文字工具)