创建型模式,又叫做静态工厂方法(Static Factory Method)模式,但不属于23种GOF设计模式之一。简单工厂模式是由一个工厂对象决定创建出哪一种产品类的实例。简单工厂模式是工厂模式家族中最简单实用的模式,可以理解为是不同工厂模式的一个特殊实现。
- 工厂(Creator)角色
简单工厂模式的核心,它负责实现创建所有实例的内部逻辑。工厂类的创建产品类的方法可以被外界直接调用,创建所需的产品对象。 - 抽象产品(Product)角色
简单工厂模式所创建的所有对象的父类,它负责描述所有实例所共有的公共接口。 - 具体产品(Concrete Product)角色
是简单工厂模式的创建目标,所有创建的对象都是充当这个角色的某个具体类的实例。
说起操作系统,市面上大概可以分为三种:
- Windows操作系统
- Linux操作系统
- Mac OS操作系统,
SayHello()
方法,和用户打招呼,需求来了就得办事,接下来秀出代码。
static void Main(string[] args) { Console.WriteLine("请选择你的操作系统:\r\n"); Console.WriteLine("A.Windows操作系统\r\n"); Console.WriteLine("B.Linux操作系统\r\n"); Console.WriteLine("C.Mac OS做系统\r\n"); string systemType = Console.ReadLine(); switch (systemType) { case "A": Console.WriteLine("你好,我是Windows操作系统,很高兴为您服务~"); break; case "B": Console.WriteLine("你好,我是Linux操作系统,很高兴为您服务~"); break; case "C": Console.WriteLine("你好,我是Mac OS,很高兴为您服务~"); break; default: Console.WriteLine("系统不支持,不能向您问好!"); break; } Console.ReadKey();
结果:
不容易维护,不容易扩展,更不容易复用,从而达不到高质量代码的要求,并且业务逻辑和客户端耦合度太高
封装、继承、多态把程序的耦合度降低,用设计模式使得程序更加的灵活,容易修改,并且易于复用。
操作系统类
/// <summary> /// 操作系统类 /// </summary> public class OS { public static string SayHello(string systemType) { string result = string.Empty; switch (systemType) { case "A": result = "你好,我是Windows操作系统,很高兴为您服务~"; break; case "B": result = "你好,我是Linux操作系统,很高兴为您服务~"; break; case "C": result = "你好,我是Mac OS,很高兴为您服务~"; break; default: result = "系统不支持,不能向您问好!"; break; } return result; } }
客户端代码
static void Main(string[] args) { Console.WriteLine("请选择你的操作系统:\r\n"); Console.WriteLine("A.Windows操作系统\r\n"); Console.WriteLine("B.Linux操作系统\r\n"); Console.WriteLine("C.Mac OS做系统\r\n"); string systemType = Console.ReadLine(); string result = OS.SayHello(systemType); Console.WriteLine(result); Console.ReadKey(); }
业务和界面
But...这样却违反了
开放封闭原则
――软件实体应当对扩展开放,对修改关闭,当我们修改了OS
类时,也破坏了这个类,如果SayHello
简单工厂模式代码。 OS父类:只包含抽象的逻辑方法
/// <summary> /// 操作系统父类 /// </summary> public class OS { public virtual string SayHello() { string result = string.Empty; return result; } }
具体的操作系统类
/// <summary> /// Windows类 /// </summary> class WindowsOS : OS { public override string SayHello() { string result = "你好,我是Windows操作系统,很高兴为您服务~"; return result; } } /// <summary> /// Linux系统类 /// </summary> class LinuxOS : OS { public override string SayHello() { string result = "你好,我是Linux操作系统,很高兴为您服务~"; return result; } } /// <summary> /// Mac OS系统类 /// </summary> class MacOS : OS { public override string SayHello() { string result = "你好,我是Mac OS操作系统,很高兴为您服务~"; return result; } } /// <summary> /// 其他系统类 /// </summary> class OtherOS : OS { public override string SayHello() { string result = "系统不支持,不能向您问好!"; return result; } }
OSFactory工厂类
class OSFactory { public static OS CreateOS(string systemType) { OS os = null; switch (systemType) { case "A": os = new WindowsOS(); break; case "B": os = new LinuxOS(); break; case "C": os = new MacOS(); break; default: os = new OtherOS(); break; } return os; } }
客户端
//根据字段不同‘生产不同’的OS类 OS result = OSFactory.CreateOS("A"); Console.WriteLine(result.SayHello()); Console.ReadKey();
对扩展开放,但还没有对修改关闭,这点在工厂方法模式中得到了一定的克服。
- 创建抽象产品类 & 定义具体产品的公共接口;
- 创建具体产品类(继承抽象产品类) & 定义生产的具体产品;
- 创建工厂类,通过创建静态方法根据传入不同参数从而创建不同具体产品类的实例;
- 外界通过调用工厂类的静态方法,传入不同参数从而创建不同具体产品类的实例
不必管这些对象究竟如何创建及如何组织的。明确了各自的职责和权利,有利于整个软件体系结构的优化。
将全部创建逻辑集中到了一个工厂类中;它所能创建的类只能是事先考虑到的,如果需要添加新的类,则就需要改变工厂类了。
这些缺点在工厂方法模式中得到了一定的克服。
- 工厂类负责创建的对象比较少;
- 客户只知道传入工厂类的参数,对于如何创建对象(逻辑)不关心;
- 由于简单工厂很容易违反责任分配原则,因此一般只在很简单的情况下应用。
――――――――――――――――――――――――――――――――――――――――――――
版权声明:本文为吴恺的原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接及本声明。
为获得更好的阅读体验,推荐至我的个人博客阅读:https://www.wukailiving.cn/yi-jian-dan-gong-han-mo-shi.html
原文地址:https://www.cnblogs.com/zaijianba/p/11519653.html
如有不足之处,欢迎指正!
来源:博客园
作者:ChooseTodo
链接:https://www.cnblogs.com/zaijianba/p/11519653.html