学习GOF23种设计模式,从学习简单工厂开始是个不错的选择,简单工厂虽不属于GOF设计模式中的一种,但它在开发中是很是经常使用的,也充分体现了面向对象开发的要点和好处,因此理解简单工厂,对于后面学习其它的模式是很是有帮助的。html
1、引出模式编程
咱们时常据说面向对象开发很厉害,因此在开发中咱们会时不时尝试用面向对象的方法去开发程序,而后,就会遇到这种状况:面对对象开发,咱们要有接口,咱们要有实现接口的具体类,用的时候咱们要遵循面向接口编程。因而乎就出现了这种状况:设计模式
IAnimal animal = new Dog(); animal.Call();
哈哈,这不就是面向接口进行编程了吗?固然,这可不是面向接口编程,虽然你使用了接口,但不表明就是面向接口编程。咱们一块儿来围观下吧。这段代码一般是写在客户端的,因而乎,客户端既知道接口,又知道了具体的实现类。有何问题?咱们仍是先来回顾一下接口最主要的做用吧!没错,就是“封装隔离”,具体的实现类被接口所封装并使其与客户端隔离,也就是说,客户端不该该知道具体实现类的存在。若是不能像上面这样作的话,客户端如今只知道一个接口,那我怎么才可以获得接口的对象呢?函数
2、简单工厂工具
1.咱们先看看简单工厂的定义吧!学习
定义:提供一个建立对象实例的功能,而无需关心其具体的实现。spa
2.上述问题的解决方案:设计
既然咱们在客户端中没法直接获得实现类的对象,那咱们能够新增一个类,让这个类来帮咱们返回实现类的对象,这样,客户端只要和新增的类有关系就好了,就不须要知道具体的类了,这样不就解除了它们之间的耦合了。code
3.简单工厂结构图:htm
IAnimal:定义客户端所须要的功能接口。
Dog:具体实现IAnimal的实现类
Pig:具体实现IAnimal的实现类
Factory:工厂,选择什么时候的实现类来建立IAnimal接口对象。
Client:客户端,经过Factory来获取IAnimal接口对象。
提示:看完第一章的朋友,看类图就能知道代码的大体实现了。
4.简单工厂示例代码:
class Program { static void Main(string[] args) { Factory factory = new Factory(); IAnimal animal = factory.Create("pig"); animal.Call(); Console.ReadKey(); } } public class Factory { public IAnimal Create(string Name) { if (Name == "pig") { return new Pig(); } else if (Name == "dog") { return new Dog(); } else { return new Pig(); } } } public interface IAnimal { void Call(); } public class Dog : IAnimal { public void Call() { Console.WriteLine("狗在叫........"); } } public class Pig : IAnimal { public void Call() { Console.WriteLine("猪在叫........"); } }
3、理解简单工厂
1.静态工厂
在客户端中咱们建立了工厂类的实例,使用该实例的Create方法,来返回所须要的接口对象。咱们其实能够将工厂类看成工具类进行使用,就是将Create方法定义成静态方法,直接经过Factory.Create()获取对象实例,最好也将该类的构造函数设为私有,这样外部就没法实例化该工厂类。静态工厂就是这么来的。
2.如何选择合适的接口对象
工厂类是如何返回合适的接口对象的呢?通常经常使用的有两种方式,第一种就是从客户端获取参数,经过对参数的判断来选择接口实例,上述的代码示例就是采用此方法,第二种是经过获取配置文件中的值,来选择接口实例。
3.工厂模式的优势
简单工厂模式帮助咱们实现了组件的封装,可让外部实现面向接口编程。
简单工厂模式实现了客户端与具体实现类的解耦。客户端只需知道工厂和接口就能够了。
4.工厂模式的缺点
增长的客户端的复杂度,若是客户端是经过参数获取接口对象的,那么客户端就要理解参数所表明的具体功能。
系统扩展困难,一旦添加新产品就不得不修改工厂逻辑,有可能形成工厂逻辑过于复杂。
5.什么时候选用工厂模式
若是想要彻底封装隔离具体的实现,让外部只能经过接口来操做封装体,能够选用简单工厂。
若是想要把对外建立对象的职责进行集中管理和控制,可使用简单工厂。
6.总结
简单工厂的本质就是选择实现,再重点就是“选择”,通常在咱们系统中接口和具体的实现类都是已经存在了的,咱们要思考的就是“如何选择”实现。