恋爱中的设计模式 之 Simple Factory模式 (简单工厂模式).doc

来源:互联网 发布:日语 推荐信 知乎 编辑:程序博客网 时间:2024/05/21 04:40

恋爱中的设计模式

简单工厂模式

----Simple Factory Pattern

 

Simple Factory模式的核心特点:

       为创建对象提供接口,将创建对象的具体过程屏蔽起来。

 

恋爱中的Simple Factory模式:

――追MM么,少不了请MM吃饭,高档饭馆去不起,KFCMcDonald之类的快餐店自然是上上之选

MM今天我要去KFC吃饭。

――到达KFC

MM我要4个鸡翅

GG好的。服务员,给我来4个鸡翅

--不几日,MM又光临Mcdonald,类似事件再次上演。

 

“案情”分析:

       无论去KFC还是McdonaldMM只要跟你说“来4个鸡翅”就行了,不用说“来4KFC的鸡翅”或“来4Mcdonald的鸡翅”,身为GG的你自然会根据所处的地点购买到相应的鸡翅。

 

       由此不难看出,Simple Factory模式将客户类(MM)和产品类(鸡翅)分隔开来,当客户类需要某种产品时,只须跟工厂类(苦力GG)请求即可。

 

Simple Factory模式的组成:

       1)        工厂类角色:这是本模式的核心,含有一定的商业逻辑和判断逻辑。它往往由一个具体类实现。 例子中的GG就属于工厂类角色

       2)        抽象产品角色:它是实际产品的抽象,提供统一的接口和方法以供实际产品去各自实现。它往往由接口或者抽象类来实现。 例子中并没有直接出现,不过对KFCMcdonald抽象,可以得到“快餐店”这个接口,它就是抽象产品类

       3)        具体产品角色:工厂类所创建的对象就是此角色的实例。它往往由一个具体类实现。 例子中的KFCMcdonald就是该角色

 

 

Simple Factory模式的优缺点:

优点:从直接创建变成“消费”,让客户更“傻瓜”。

       满足DIP依赖倒转原则,Dependence Inversion Principle,要针对接口编程,不要针对实现编程,即高层类对底层类开放接口,而不是开放实现)。

       满足LOD迪米特法则,Law of Demeter,只与你直接的朋友通信,而避免和陌生人通信,MM只跟GG通信,而不去跟快餐店店员通信

消费者无须任何变动就可消费新产品。如:如果你们到了振鼎鸡,那么MM也只要说“4个鸡翅”即可,MM不用作任何变动

 

缺点:不满组OCP(开放-关闭原则,Open-Closed Principle,对扩展开放,对修改关闭)。

当产品发生变动时,工厂类(GG)也要做相应的修改。如:如果增加一个新的产品(比如振鼎鸡),工厂类就要作相应的修改;如果MM准备尝试新产品(比如汉堡),工厂类也需要作相应的修改。

 

Simple Factory模式的使用:

       顾名思义,Simple Factory模式是一种很简单的模式,它其实是Factory Method模式的一种特殊情况。当用户需要使用某个对象(吃鸡翅),但好几个类都可以生成这种对象(KFCMcdonald都卖鸡翅),用户不想去考虑该实例化哪个类的时候,就可以考虑使用这种方法。

 

       使用了Simple Factory的一个明显的好处就是:用户不需要去实例化对象,只要“消费”对象就可以了。

 

       如何去实现Simple Factory模式呢?可以分以下几个步骤:

1)  分清角色:客户,产品,工厂(MM是客户,GG是工厂,KFCMcdonald是产品);

2)  对产品抽象,创建抽象产品接口(“快餐店”);

3)  实现具体产品(“KFC”类和“Mcdonald”类);

4)  实现工厂类,该类是整个环节的核心,通过工厂类,可以获得具体产品类的实例,这个函数应该被声明为静态函数

5)  其他操作:客户类,客户消费动作等等。

 

例示代码:

       编程环境:Visual Studio 2005

       运行方法:通过VS05新建C#的Console Application,将下面的代码全部拷贝,覆盖Program.cs中的代码,然后即可运行。

/*

 * 1SIMPLE FACTORY:追MM少不了请吃饭了,麦当劳的鸡翅和肯德基的鸡翅都是MM爱吃的东西,

 * 虽然口味有所不同,但不管去麦当劳或肯德基,MM只要跟你说“我要个鸡翅”就可以了,

 * 如果在KFC,你肯定不会买来MCDONALD的鸡翅,反之亦然。

 */

 

using System;

using System.Collections.Generic;

using System.Text;

 

namespace Simple_Factory

{

    /// <summary>

    /// 产品接口

    /// </summary>

    interface IFastFood

    {

        void SellChickenWing();

    }

 

    /// <summary>

    /// 实际产品

    /// </summary>

    class KFC : IFastFood

    {

        public void SellChickenWing()

        {

            Console.WriteLine("欢迎光临KFC!这是您点的个鸡翅.请慢慢享用");

        }

    };

 

    /// <summary>

    /// 实际产品

    /// </summary>

    class Mcdonald : IFastFood

    {

        public void SellChickenWing()

        {

            Console.WriteLine("欢迎光临Mcdonald!这是您点的个鸡翅.请慢慢享用");

        }

    };

 

    /// <summary>

    /// 工厂类,苦力...

    /// </summary>

    class SSGG

    {

        public static IFastFood GoTo(string placeName)

        {

            switch(placeName)

            {

                case "KFC" :

                    {

                        return new KFC();

                    }

                case "Mcdonald" :

                    {

                        return new Mcdonald();

                    }

                default :

                    return null;

            }

        }

    };

 

    /// <summary>

    /// 客户类

    /// </summary>

    class PPMM

    {

        static void Main(string[] args)

        {

            //某天,二人来到KFC吃饭,MM点了个鸡翅

            IFastFood targetPlace = SSGG.GoTo("KFC");

            targetPlace.SellChickenWing();

 

            //隔天,二人来到Mcdonald吃饭,MM又点了个鸡翅

            IFastFood targetPlace2 = SSGG.GoTo("Mcdonald");

            targetPlace2.SellChickenWing();

        }

    }

}

 

 
原创粉丝点击