工厂方法 Factory Method
背景:有一个应用框架,它可以向用户显示多个文档。在这个框架中,两个主要的抽象是类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相关推荐
- Spring 通过工厂方法(Factory Method)来配置bean
在spring的世界中, 我们通常会利用bean config file 或者 annotation注解方式来配置bean. 在第一种利用bean config file(spring xml)方式中 ...
- 设计模式--工厂方法(Factory Method)模式
模式定义 定义一个用于创建对象的接口,让子类决定实例化哪一个类,使得一个类的实例化延迟到子类 类图 应用场景 1.当你不知道该使用对象的确切类型的时候: 2.当你希望为库或框架提供扩展其内部组件的方法 ...
- [设计模式-创建型]工厂方法(Factory Method)
概括 名称 Factory Method 结构 动机 定义一个用于创建对象的接口,让子类决定实例化哪一个类.Factory Method 使一个类的实例化延迟到其子类. 适用性 当一个类不知道它所必 ...
- Java工厂方法---Factory Method
工厂方法:定义一个用于创建对象的接口,让子类决定实例化哪一个类,工厂方法使一个类的实例化延迟到其子类 工厂方法优点: 1.支持OCP原则,开闭原则,把创建产品的细节隐藏起来,对上层类的调用时透明的 2 ...
- php factory interface,【PHP 設計模式大頭菜】工廠方法 Factory Method
工廠方法 Factory Method 工廠方法,跟抽象工廠有點像,可是又沒那麼像,抽象工廠的工廠會有個抽象類別,並且把工廠要做且會重工的事情寫在抽象類別當中,而工廠方法則是需要定義一個工廠介面,並且 ...
- 当Android遇上设计模式之工厂方法(Factory)模式
文章目录 1. 简单工厂模式 2.1 定义 2.2 代码实现 2.3 使用场景 2. 工厂方法模式 2.1 定义 2.2 代码实现 2.3 使用场景 设计模式六大原则: 单一职责原则:就一个类仅有一个 ...
- 工厂方法模式(Factory Method)简介
工厂方法模式 名字 跟已经介绍的 简单工厂模式很类似. 实际上它们的模型也是十分相似的. 我们先看看工厂模式的定义. 一. 工厂方法(Factory Method)模式定义 教材上是这样写的: 工厂方 ...
- 【设计模式】工厂方法模式 Factory Method Pattern
在简单工厂模式中产品的创建统一在工厂类的静态工厂方法中创建,体现了面形对象的封装性,客户程序不需要知道产品产生的细节,也体现了面向对象的单一职责原则(SRP),这样在产品很少的情况下使用起来还是很方便 ...
- 工厂方法(Factory Method)
能够弥补simple factory的不足 将类的实例化(具体产品的创建)延迟到工厂类的子类(具体工厂)中完成,有子类决定应实例化哪个类. 角色: (1) Product(抽象产品):它是定义产品的接 ...
最新文章
- Ceilometer Polling Performance Improvement
- [IIS]修改MaxFieldLength与MaxRequestBytes彻底解决Request Too Long的问题
- springMVC,mybatis配置事务
- 边工作边刷题:70天一遍leetcode: day 98
- 一步步学习微软InfoPath2010和SP2010--第八章节--使用InfoPath表单Web部件
- oracle sql 分区查询语句_Oracle 分区概述
- qt connect函数_Qt 串口上位机开发Rice 上位机 学习开发
- iOS-获取通讯录信息
- C语言显示系统时间的几个办法
- 谷粒商城:跨域问题解决
- 正余弦变换、和差、倍角公式
- 匈牙利命名法为何被淘汰_体育午报:15年魔咒破除!国足淘汰赛终迎一胜
- Mac解决docker kubernetes一直starting
- QT Creator 应用程序*.exe文件打包发布详细教程【绿色便携形式 和 安装包形式】
- 正则表达式在线测试通过,java运行通不过
- 曙光服务器重装系统centos7.9
- DEVOPS架构师 -- 05从零开始构建基于Kubernetes的DevOps平台
- 阿里P8亲自教你!Android高级工程师进阶学习,全套教学资料
- 苹果自研处理器搭载全新MacBook 价格更亲民
- 2022年7月份模拟考题解答
热门文章
- java有几种变量_java有多少种变量?java类变量怎么使用?
- 机器人 瓷砖墙面清洗_墙壁清洁机器人解析
- 计算机组成原理知识点白中英,计算机组成原理重点整理(白中英版) 考试必备
- 抓球球的机器人应该怎么玩_王者荣耀:在游戏中当自己优势队友劣势的时候应该怎么玩?...
- python问题解决了吗_Python 问题怎么解决?
- Android Studio Gradle输出信息乱码
- java 新建 api 案列_Java利用webservice创建接口案例源码
- 云麦体脂秤华为体脂秤_华为、小米和有品体脂秤哪个品牌好?三款智能体脂秤横评结果排行...
- LeetCode算法入门- Roman to Integer Integer to Roman -day8
- horizon client 无法识别域_iText for Mac(OCR识别图中文字工具)