工厂方法 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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/569980.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

解析.DBC文件, 读懂CAN通信矩阵,实现车内信号仿真

通常我们拿到某个ECU的通信矩阵数据库文件&#xff0c;.dbc后缀名的文件。 直接使用CANdb Editor打开&#xff0c;可以很直观的读懂信号矩阵的信息&#xff0c;例如下图&#xff1a; 现在要把上图呈现的信号从.dbc文件中解析出来&#xff0c;供实现自动化仿真总线信号使用&…

01-数据库基础

1 数据库系统概述 1.1 数据库的4个基本概念 数据&#xff08;Data&#xff09;:数据库中存储的基本对象数据库&#xff08;Database&#xff09;:长期储存在计算机内、有组织的、可共享的大量数据的集合。数据库管理系统&#xff08;DBMS&#xff09;:用户与操作系统之间的一层…

linux命令——crontab的使用方法

一、crond简介 crond是linux下用来周期性的执行某种任务或等待处理某些事件的一个守护进程&#xff0c;与windows下的计划任务类似&#xff0c;当安装完成操作系统后&#xff0c;默认会安装此服务工具&#xff0c;并且会自动启动crond进程&#xff0c;crond进程每分钟会定期检…

第一个程序 快速编译链接的办法

转载于:https://www.cnblogs.com/ZHONGZHENHUA/p/10223249.html

变量 和 注释

转自&#xff1a;白月黑羽Python3教程&#xff1a;http://www.python3.vip/doc/tutorial/python/0003/ Python语言中&#xff0c;所有的 数据 都被称之为 对象。 每个整数、小数、字符串&#xff0c;还有我们后面要学的 字典、元组、列表 等&#xff0c; 都是对象。 在Python程…

jQuery教程03-jQuery 元素、id、.class和*全选择器

jQuery 基础选择器 jQuery 选择器允许您对 HTML 元素组或单个元素进行操作。 jQuery 选择器基于元素的 id、类、类型、属性、属性值等"查找"&#xff08;或选择&#xff09;HTML 元素。 它基于已经存在的 CSS 选择器&#xff0c;除此之外&#xff0c;它还有一些自定…

前台一键备份数据库+PHP实现方式

一、实现思路 1、单击备份按钮传递参数到后台&#xff0c;ajax实现&#xff1a; function backupDatabase(){var back backupDatabase;$.ajax({url:system_backup.php?dobackupDatabase,type:POST,data:back,dataType:json,beforeSend:function(){intervalwindow.setInterv…

windows+PHP+shell_exec()无法执行的原因

今天使用shell_exec()命令执行wkhtmltopdf.exe 生成pdf文件时&#xff0c;总是无法生成PDF文件&#xff0c;使用var_dump()打印返回值&#xff0c;结果是null。可是检查代码并没有什么问题啊&#xff1f;执行程序的目录是 D:\Program Files\wkhtmltopdf\bin\wkhtmltopdf.exe …

通过wkhtmltopdf导出支持CSS样式的pdf文件

在公司项目中发现有下载pdf文件的功能&#xff0c;但是不能识别CSS样式&#xff0c;导致下载的pdf文件格式显得很别扭&#xff0c;虽然能看但是难看。然后就是百度啊&#xff0c;google啊&#xff0c;最后找到一款能够识别CSS样式的软件—wkhtmltopdf。wkhtmltopdf可以直接把任…

【算法基础笔记】常用的排序算法的时间、空间复杂度,部分排序算法原理

冒泡排序 比较相邻的元素。如果第一个比第二个大&#xff0c;就交换他们两个。对每一对相邻元素做同样的工作&#xff0c;从开始第一对到结尾的最后一对。在这一点&#xff0c;最后的元素应该会是最大的数。针对所有的元素重复以上的步骤&#xff0c;除了最后一个。持续每次对越…

windows定时任务

在windows系统中创建定时任务&#xff0c;与在linux中创建定时任务是不同的。因为平时会用到windows的定时任务&#xff0c;所以在这里做个记录&#xff0c;同事给小伙伴们一个参考。 一、windows定时任务的工作流程 1、首先创建一个批处理脚本&#xff0c;就是扩展名为bat的…

jQuery教程05-层级选择器

jQuery选择器之层级选择器 文档中的所有的节点之间都是有这样或者那样的关系。我们可以把节点之间的关系可以用传统的家族关系来描述&#xff0c;可以把文档树当作一个家谱&#xff0c;那么节点与节点直接就会存在父子&#xff0c;兄弟&#xff0c;祖孙的关系了。 选择器中的…

jQuery教程06-基本筛选选择器

jQuery选择器之基本筛选选择器 很多时候我们不能直接通过基本选择器与层级选择器找到我们想要的元素&#xff0c;为此jQuery提供了一系列的筛选选择器用来更快捷的找到所需的DOM元素。筛选选择器很多都不是CSS的规范&#xff0c;而是jQuery自己为了开发者的便利延展出来的选择…

jQuery教程07-内容筛选选择器

jQuery选择器之内容筛选选择器 基本筛选选择器针对的都是元素DOM节点&#xff0c;如果我们要通过内容来过滤&#xff0c;jQuery也提供了一组内容筛选选择器&#xff0c;当然其规则也会体现在它所包含的子元素或者文本内容上 内容过滤器描述如下表&#xff1a; 注意事项&…

Apache服务器下载、安装、启动、关闭及卸载(win版)

今天讲一下64位win7环境下apache服务器的下载、安装及配置的过程。 1、Apache的下载 百度搜索apache&#xff0c;然后单击选择的下载网站&#xff1a; 我选择的是第一个网站&#xff0c;第二个也可以。 进入之后&#xff0c;确定下载的apache版本&#xff0c;这里选择2.4…

Navicat导入Excel表格数据

现在使用图像化工具来管理数据库是越来越方便了&#xff0c;PhpMyAdmin和Navicat都是管理数据库的好工具&#xff0c;这里我记录一下使用Navicat导入xls表格数据的方法。大家可以作为参考。 1、查看一下导入的表格&#xff0c;注意第一行是字段名&#xff08;也可以不要第一行…

MySQL5.7数据库软件下载教程

1、搜索MySQL 2、选择MySQL社区开源版本 3、单击下载社区版 4、选择所需版本-这里选择安装版 5、单击Download 6、建立Oracle账户/登录Oracle账户 注意&#xff1a;这里就不注册了&#xff0c;直接登录。 7、填写信息 8、单击下载MySQL数据库安装包 9…

后台传参与select-option标签的默认选中

从后台传递过来的参数是数据的详情页&#xff0c;在编辑页的select下拉框汇总既要显示所有的选项&#xff0c;又要默认显示选中项&#xff0c;后台传递过来的value值与option的value值相同时就默认选中&#xff08;即给option标签添加selected”selected”属性&#xff09;。 …

jQuery教程08-属性筛选选择器

jQuery选择器之属性筛选选择器 属性选择器让你可以基于属性来定位一个元素。可以只指定该元素的某个属性&#xff0c;这样所有使用该属性而不管它的值&#xff0c;这个元素都将被定位&#xff0c;也可以更加明确并定位在这些属性上使用特定值的元素&#xff0c;这就是属性选择…

有关Canvas的一点小事—图像绘制

1、 使用canvas绘制图像 什么是图像&#xff1f;在js中它就是一个<img src””>&#xff0c;<img>有两种接收图像信息的方法&#xff0c;一个是直接链接到图像地址&#xff0c;一个使用base64数据&#xff0c;不过这里讨论的是canvas要使用的Image对象。我们有两个…