工厂顾名思义就是生产商品的,造纸厂生产纸,鞋厂生产鞋,在面向对象的编程思想中,那么我们这里设计模式中的简单工厂就是为我们生产对象的。
在介绍简单工厂模式之前,我们先来了解一下怎么生产一个商品,以生产笔记本为例,我们怎么让一个笔记本生产出来呢,最简单的方式,就是我们通过实例化的方式,就能产生一个笔记本对象,生产出来的笔记本我们想让它介绍一下自己,那么我们就调用它的Introduce方法。
首先我们定义一个Leveno类,用于描述联想笔记本,代码如下:
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
namespace SimpleComputer.Computer { public class Leveno { public override void Introduce() { Console.WriteLine("我是联想电脑"); } } }
在Main方法中实例化并调用它的Introduce方法,让它介绍一下自己,代码如下:
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
class Program { static void Main(string[] args) { Leveno com = new Leveno(); com.Introduce(); Console.ReadKey(); } }
一个简单的产生笔记本的实例算是结束了,接下来我们来想这样一个问题,假如说我们想生产一个Dell的笔记本电脑,那我们又该怎样实现,加入我们采用客户端输入相应的品牌标识得到相应的对象的话,首先我们需要对Dell、Leveno提取一个父类,用于存储生产的笔记本电脑,此父类中必须包含所有的Introduce虚方法,用于让子类实现,具体父类及子类代码如下:
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
namespace SimpleComputer.Computer { public class ComputerBase { public virtual void Introduce() { Console.WriteLine("我是一台电脑"); } } }
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
namespace SimpleComputer.Computer { public class Leveno:ComputerBase { public override void Introduce() { Console.WriteLine("我是联想电脑"); } } }
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
namespace SimpleComputer.Computer { public class Dell : ComputerBase { public override void Introduce() { Console.WriteLine("我是戴尔电脑"); } } }
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
namespace SimpleComputer.Computer { public class Sony : ComputerBase { public override void Introduce() { Console.WriteLine("我是索尼电脑"); } } }
所有的电脑父类,电脑子类都已经实现了,接下来要在Main方法中进行实现了,只需要在Main方法中调用就可以了,具体代码的实现如下:
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
class Program { static void Main(string[] args) { Console.WriteLine("请输入电脑的标志"); string name = Console.ReadLine(); ComputerBase computer = null; switch (name) { case "Leveno": computer = new Leveno(); break; case "Dell": computer = new Dell(); break; case "Sony": computer = new Sony(); break; default: computer = new ComputerBase(); break; } computer.Introduce(); Console.ReadKey(); } }
根据封装、单一职责的原则,一个类只能做一件事情,Main方法中生产不同的电脑,显然违背了单一职责原则,代码重构一下,把生产电脑的方法封装在生产电脑类中作为它的方法,这个类叫做电脑工厂类,具体实现如下:
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
namespace SimpleComputer { public class ComputerFactory { public static ComputerBase CreateComputer(string name) { ComputerBase computer = null; switch (name) { case "Leveno": computer = new Leveno(); break; case "Dell": computer = new Dell(); break; case "Sony": computer = new Sony(); break; default: computer = new ComputerBase(); break; } return computer; } } }
那我们现在的Main方法中就变得更加简单了,具体代码如下:
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
namespace SimpleComputer { class Program { static void Main(string[] args) { Console.WriteLine("请输入电脑的标志"); string name = Console.ReadLine(); ComputerBase computer = ComputerFactory.CreateComputer(name); computer.Introduce(); Console.ReadKey(); } } }
好了,一个简单工厂的实例就算结束了,那么让我们看一下简单工厂的UML图:
以上就是简单工厂的使用以及UML图,其实简单工厂就是生产一件商品之前进行的一次判断,客户想要什么产品,就生产什么产品,同时也让整个系统的耦合度降低,假如业务需求更改,现在再增加一个笔记本品牌,只需实现ComputerBase类,在工厂类中再添加一个case判断就搞定了,不需要再像之前一样更改Main方法里面的内容,这样的设计是不是更加便于扩展。
本篇文章简单工厂设计模式至此,谢谢您收看我的博客。