C# 设计模式巩固 - 工厂方法模式
2024-09-01 05:31:23
前言
实在编不出来了~
介绍 - 工厂方法模式
官方定义:(下面摘自百度百科)工厂方法模式(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
最新文章
- error: RPC failed; result=22, HTTP code = 411
- JConsole监控远程Tomcat服务器
- 如何安装node.js支持插件
- JAVA CDI 学习(5) - 如何向RESTFul Service中注入EJB实例
- 浏览器兼容性之Css篇
- javascript中apply()和call()方法的区别
- sqlserver中索引优化
- flume ng之TailSource
- ionic中的生命周期函数
- hadoop 蓄水池抽样 分布式抽样
- varchar与nvarchar的区别
- Django web开发【5】 实现标签功能
- 使用 WTForms 进行表单验证的例子
- 冒泡排序(JAVA实现)
- xcfe桌面快捷键整理
- Spring boot + mybatis + orcale实战(干货)
- Linux 文件系统剖析
- File类_构造函数
- Java 日期时间 Date类型,long类型,String类型表现形式的转换
- 驱动程序vmci.sys版本不正确。请尝试重新安装 VMware
热门文章
- 20145316《Java程序设计》实验二报告
- iOS跳转到Touch ID设置界面
- SiteMesh使用(2.4.2)
- Ubuntu16.04桌面版 连接到ftp服务器
- .NET Core + EF 报nuget包不兼容
- Linux上db2安装
- PHP jsonencode 已经json中包含 汉字的处理
- composer错误_Content-Length mismatch, received 84697 bytes out of the expected..
- 20145328 《Java程序设计》课程总结
- 20145333《Java程序设计》第3次实验报告