2009年10月5日星期一

Factory Method 工厂方法设计模式

在模板方法的设计模式中,可以制作做中国菜的步骤和顺序的模板类,只要按照这个模板生产子类,并重写模板中的方法,就可以做出合格的中国菜,但这种模板的方式只能生产一种菜,比如中国菜。如果想生产法国菜,因为生产的步骤和方法都不同,所以只能修改模板类,这是我们所不希望的。换句话说,我们希望在模板中不具体规定做那种菜,而是在子类中指定菜的种类。这就需要工厂方法的设计模式。
在下面的例程中,先定义一个抽象的Dishes类,然后具体实现它的2个子类,ChineseDishes和FranceDishes,在子类内,可以重写getDishes,规定做每种菜的手续和顺序。接着,定义一个抽象类DishFactory,它内部定义了一个抽象的方法factoryMethod,返回一个抽象的菜,重写它可以得到具体的菜。然后实现了2个具体的工厂,生产中国菜的工厂,重写了factoryMethod,返回一个中国菜,生产法国菜的工厂,重写factoryMethod,返回一个法国菜。
在具体的应用中,想做中国菜的时候,制作一个中国菜工厂并调用makeDishes()方法,想做法国菜的时候,制作一个法国菜的工厂并调用makeDishes()。

abstract class Dishes
{
public abstract string getDishes();
}

class ChineseDishes : Dishes
{
public override string getDishes()
{
return "Step1 -> Step2 -> Step3 --> Chinese Dishes.\n";
}
}
class FranceDishes : Dishes
{
public override string getDishes()
{
return "StepA -> StepB -> StepC --> France Dishes.\n";
}
}

abstract class DishFactory
{
public abstract Dishes factoryMethod();
public void makeDishes()
{
Dishes dishes = this.factoryMethod();
Console.Write(dishes.getDishes());
}
}

class ChineseDishFactory : DishFactory
{
public override Dishes factoryMethod()
{
return new ChineseDishes();
}
}
class FranceDishFactory : DishFactory
{
public override Dishes factoryMethod()
{
return new FranceDishes();
}
}

public static void Main()
{
DishFactory cdf = new ChineseDishFactory();
cdf.makeDishes();

DishFactory fdf = new FranceDishFactory();
fdf.makeDishes();
}

输出结果:
Step1 -> Step2 -> Step3 --> Chinese Dishes.
StepA -> StepB -> StepC --> France Dishes.

没有评论:

发表评论