返回首页
当前位置: 主页 > 网络编程 > .Net实例教程 >

Simple Factory模式 (简单工厂模式)

时间:2010-10-28 17:23来源:知行网www.zhixing123.cn 编辑:麦田守望者

Simple Factory模式的核心特点:
为创建对象提供接口,将创建对象的具体过程屏蔽起来。


恋爱中的Simple Factory模式:
――追MM么,少不了请MM吃饭,高档饭馆去不起,KFC,McDonald之类的快餐店自然是上上之选

MM:“今天我要去KFC吃饭。”

――到达KFC

MM:“我要4个鸡翅”

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

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


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


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


Simple Factory模式的组成:
1) 工厂类角色:这是本模式的核心,含有一定的商业逻辑和判断逻辑。它往往由一个具体类实现。 例子中的GG就属于工厂类角色
2) 抽象产品角色:它是实际产品的抽象,提供统一的接口和方法以供实际产品去各自实现。它往往由接口或者抽象类来实现。 例子中并没有直接出现,不过对KFC和Mcdonald抽象,可以得到“快餐店”这个接口,它就是抽象产品类
3) 具体产品角色:工厂类所创建的对象就是此角色的实例。它往往由一个具体类实现。 例子中的KFC和Mcdonald就是该角色


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模式的一种特殊情况。当用户需要使用某个对象(吃鸡翅),但好几个类都可以生成这种对象(KFC,Mcdonald都卖鸡翅),用户不想去考虑该实例化哪个类的时候,就可以考虑使用这种方法。


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


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

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

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

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

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

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


例示代码:
编程环境:Visual Studio 2005

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

/*
* 1、SIMPLE 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();
}
}
}

------分隔线----------------------------
标签(Tag):C# C#实例教程 c#基础教程 C#源码
------分隔线----------------------------
推荐内容
猜你感兴趣