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):通过对产品类的抽象使其创建 ...
随机推荐
- BZOJ 5427: 最长上升子序列
$f[i] 表示长度为i的最长上升子序列的最后一位的最小值是多少$ 对于普通的$LIS我们可以二分确定位置去更新$ 再来考虑对于这个,如果有某一位没有确定的话 那么这一位是可以随便取的,也就是说,所有 ...
- Java命令:Jstack
jstack是java虚拟机自带的一种堆栈跟踪工具. 功能 jstack用于生成java虚拟机当前时刻的线程快照.线程快照是当前java虚拟机内每一条线程正在执行的方法堆栈的集合,生成线程快照的主要目 ...
- linux 自启动方法
参考文章:http://vod.sjtu.edu.cn/help/Article_Print.asp?ArticleID=626 http://hiandroidstudio.blog.51cto.c ...
- qml源码查看
已5.4为例说明: QtQuick源码查看: 地址:Qt\Qt5.4.1\5.4\Src\qtdeclarative\src\quick\items Qt control源码查看: 地址:\Qt\Qt ...
- 20145327 《Java程序设计》第九周学习总结
20145327 <Java程序设计>第九周学习总结 教材学习内容总结 JDBC是用于执行SQL的解决方案,开发人员使用JDBC的标准接口,数据库厂商则对接口进行操作,开发人员无需接触底层 ...
- 20145329 吉东云《Java程序设计》第二周学习总结
教材学习内容总结 第三章 基础语法 基本类型 1.整数(short.int.long) 2.字节(byte),可表示-128~127的整数 3.浮点数(float/double),主要储存小数数值 4 ...
- LCD1602
一.关于LCD1602: 在编写LCD1602程序前,我们必须了解其手册上一些非常重要的信息,如果这些信息不能理解透彻,编程可能会遇到或多或少的问题,在此先大致归纳几点. 1.管脚: 1602共16个 ...
- java中把指数形式的数字转为正常形式显示
/** * 当浮点型数据位数超过10位之后,数据变成科学计数法显示.用此方法可以使其正常显示. * @param value * @return Sting */ public static Stri ...
- codeforces 1A - math - ceil
2017-08-24 15:42:30 writer: pprp 感觉自己好菜啊,这个题都没有做的很好 题意很简单,用a * a 的地砖,将 n * m 的地板铺满,问最少需要多少个地砖? 一开始打算 ...
- Docker 坑点记录
1 关于 Docker Windows 文件夹问题 C:\Users Docker Machine tries to auto-share your /Users (OS X) or C:\Users ...