C# 设计模式巩固 - 工厂方法模式
前言
实在编不出来了~
介绍 - 工厂方法模式
官方定义:(下面摘自百度百科)工厂方法模式(FACTORY METHOD)是一种常用的对象创建型设计模式,此模式的核心精神是封装类中不变的部分,提取其中个性化善变的部分为独立类,通过依赖注入以达到解耦、复用和方便后期维护拓展的目的。它的核心结构有四个角色,分别是抽象工厂;具体工厂;抽象产品;具体产品;
实现
继续上一篇滑板鞋的例子来。^ - ^
我们知道简单工厂的其中一个缺点就是每加一类产品就需要修改工厂类的方法,我们换一种实现方式,把工厂抽象出来,下面看实现:
先是鞋子:
/// <summary>
/// 鞋子基类
/// </summary>
public abstract class Shoes
{
public abstract string Name { get; }
} /// <summary>
/// 凉鞋
/// </summary>
public class Sandal : Shoes
{
public override string Name
{
get
{
return "凉鞋";
}
}
}
/// <summary>
/// 棉鞋
/// </summary>
public class CottonPaddedShoes : Shoes
{
public override string Name
{
get
{
return "棉鞋";
}
}
}
然后是抽象工厂:
public abstract class ShoesFactory
{
public abstract Shoes Create();
}
下面我们想生产凉鞋怎么办呢?我们需要创建一个凉鞋的工厂类:
/// <summary>
/// 凉鞋工厂类
/// </summary>
public class SandalFactory : ShoesFactory
{
public override Shoes Create(string shoesType)
{
return new Sandal();
}
}
下面请看调用:
class Program
{
static void Main(string[] args)
{
//凉鞋厂
ShoesFactory factory = new SandalFactory();
//制造鞋子
Shoes shoes = factory.Create();
//看看是不是凉鞋
Console.WriteLine("打开一看是:" + shoes.Name);
Console.Read();
}
}
假如还想要棉鞋怎么办? - 我们只要再创建个棉鞋厂的类来生产棉鞋就行了。
/// <summary>
/// 棉鞋工厂类
/// </summary>
public class CottonPaddedShoesFactory : ShoesFactory
{
public override Shoes Create()
{
return new CottonPaddedShoes();
}
}
调用和凉鞋类似:
class Program
{
static void Main(string[] args)
{
//凉鞋厂
ShoesFactory factory = new SandalFactory();
//制造鞋子
Shoes shoes = factory.Create();
//看看是不是凉鞋
Console.WriteLine("打开一看是:" + shoes.Name); Console.WriteLine("我还想要棉鞋...");
//棉鞋
ShoesFactory factory1 = new CottonPaddedShoesFactory();
//制造鞋子
Shoes shoes1 = factory.Create();
//看看是不是棉鞋
Console.WriteLine("打开一看是:" + shoes1.Name);
Console.Read(); }
}
下面是结果:

分析
和简单工厂模式比起来我每次增加新的产品时我只需要增加新的工厂和新的类就可以了,而不用修改工厂的方法。这很好的体现了体现了开放闭合原则(OCP)。
代码更加整洁,维护起来更容易。
个人觉得每加个产品都要加个产品类和工厂类,时间长了会有大量的类提高了系统的复杂度。
转载请注明出处:http://www.cnblogs.com/xinwang/p/6344449.html
C# 设计模式巩固 - 工厂方法模式的更多相关文章
- C#设计模式(3)——工厂方法模式
一.概念:定义一个用于创建对象的接口,让子类决定实例化哪一个类,工厂方法使一个类的实例化延迟到其子类. 二.代码实现 namespace 设计模式之工厂方法模式 { /// <summary&g ...
- 乐在其中设计模式(C#) - 工厂方法模式(Factory Method Pattern)
原文:乐在其中设计模式(C#) - 工厂方法模式(Factory Method Pattern) [索引页][源码下载] 乐在其中设计模式(C#) - 工厂方法模式(Factory Method Pa ...
- C#设计模式(3)——工厂方法模式(转)
C#设计模式(3)——工厂方法模式 一.引言 在简单工厂模式中讲到简单工厂模式的缺点,有一点是——简单工厂模式系统难以扩展,一旦添加新产品就不得不修改简单工厂方法,这样就会造成简单工厂的实现逻辑过 ...
- Java设计模式之工厂方法模式(转) 实现是抽象工厂?
Java设计模式之工厂方法模式 责任编辑:覃里作者:Java研究组织 2009-02-25 来源:IT168网站 文本Tag: 设计模式 Java [IT168 技术文章] ...
- php设计模式之工厂方法模式
php设计模式之工厂方法模式 工厂方法模式 工厂方法模式(Factory Method Pattern)又称为工厂模式,也叫虚拟构造器(Virtual Constructor)模式或者多态工厂(Pol ...
- java 23 - 1 设计模式之工厂方法模式
转载: JAVA设计模式之工厂模式(简单工厂模式+工厂方法模式)
- Java设计模式 之 工厂方法模式
1. 使用设计模式的好处:可提高代码的重复性,让代码更容易被他人理解,保证代码的可靠性. 2. 工厂模式定义:就是创建一个工厂类来创建你需要的类,工厂模式包括工厂模式和抽象工厂模式,抽象工厂模式是工厂 ...
- Android设计模式系列--工厂方法模式
工厂方法模式,往往是设计模式初学者入门的模式,的确,有人称之为最为典型最具启发效果的模式.android中用到了太多的工厂类,其中有用工厂方法模式的,当然也有很多工厂并不是使用工厂方法模式的,只是工具 ...
- 设计模式之 - 工厂方法模式 (Factory Method design pattern)
1. 模式意图: 定义一个用于创建对象的接口,让子类决定实例化哪一个类,工厂方法使一个类的实例化延迟到其子类. 2. 别名(Virtual Constructor) 3. 结构 4. 工厂方法模式C ...
- 再起航,我的学习笔记之JavaScript设计模式06(工厂方法模式)
上一次已经给大家介绍了简单工厂模式,相信大家对创建型设计模式有了初步的了解,本次我将给大家介绍的是工厂方法模式. 工厂方法模式 工厂方法模式(Factory Method):通过对产品类的抽象使其创建 ...
随机推荐
- AtCoder Regular Contest 080 E - Young Maids
地址:http://arc080.contest.atcoder.jp/tasks/arc080_c 题目: E - Young Maids Time limit : 2sec / Memory li ...
- POJ - 3648 Wedding (2-SAT 输出解决方案)
题意:有N-1对夫妇和1对新郎新娘要出席婚礼,这N对人要坐在走廊两侧.要求每对夫妇要坐在不同侧.有M对人有通奸关系,对于这一对人,不能同时坐在新娘对面(新娘新郎也可能和别人有通奸关系).求如何避免冲突 ...
- Salesforce中Html的转义,InputField和RemoteAction
在Salesforce的开发中,有时候需要在对象中插入记录,其中有的字段需要插入Html,但是对于输入Html的域,大多数框架和网站都需要做Html的转义处理,防止XSS或者SQL注入攻击.有时候我们 ...
- 关于TOSCA自动化测试工具, 我想问一些问题(持续整理中)
通过学习,实践踩坑,有以下问题不太明白 1. Artifacts and results from your complete test portfolio (cross-browser, mobi ...
- 带你走进ajax(2)
ajax原理介绍 传统的web应用 传统的web应用是客户端向服务器发送一个http请求后,客户端要一直等待服务器的响应,这时用户什么事也干不成. 最麻烦的是对于表单的提交.比如用户要填写用户信息,等 ...
- dubbo-admin 监控中心 部署
dubbo-admin部署 下载: GitHub:https://github.com/search?q=dubbo-admin 百度网盘: 链接:https://pan.baidu.com/s/1v ...
- 使用.NET Core和Vue搭建WebSocket聊天室
博客地址是:https://qinyuanpei.github.io. WebSocket是HTML5标准中的一部分,从Socket这个字眼我们就可以知道,这是一种网络通信协议.WebSocket是 ...
- MAC VNC SSH roo用户开通
第一步:ssh: user@xxx.xxx.xxx 第二步:开启VNC 开启VNC共享桌面: sudo /System/Library/CoreServices/RemoteManagement/A ...
- 20145331 《Java程序设计》第2次实验报告
20145331 <Java程序设计>第2次实验报告 实验二 Java面向对象程序设计 一.实验内容 1.初步掌握单元测试和TDD 2.理解并掌握面向对象三要素:封装.继承.多态 3.初步 ...
- 20145201李子璇《网络对抗》逆向及Bof基础实践
20145201李子璇<网络对抗>逆向及Bof基础实践 实践目标 本次实践的对象是一个名为pwn1的linux可执行文件. 该程序正常执行流程是:main调用foo函数,foo函数会简单回 ...