设计模式之简单工厂(二)

学习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.总结

简单工厂的本质就是选择实现,再重点就是“选择”,通常在咱们系统中接口和具体的实现类都是已经存在了的,咱们要思考的就是“如何选择”实现。

相关文章
相关标签/搜索