您的位置:首页 > 其它

抽象工厂模式 AbstractFactory---Design Pattern 2

2014-08-11 23:03 357 查看
抽象工厂模式 AbstractFactory

抽象工厂模式:提供一个创建产品的接口来负责创建相关或依赖的对象,而不具体明确指定具体类。

//抽象工厂类“总部”AbstractFactory封装了一系列创建产品的接口
//[优点]虽然提高了扩展性,[缺点]但在增加接口(新产品)时会涉及到所有子类的更改
public abstract class AbstractFactory
{
public abstract ChineseFood CreateChineseFood();    //提供创建中餐的接口
public abstract WestFood CreateWestFood();  //提供创建西餐的接口
}

//原来的“分工厂” 子类BeijingFactory负责实现北京特色产品的创建
public class BeijingFactory : AbstractFactory
{
//产品的具体创建
public override ChineseFood CreateChineseFood()
{
return new ChineseFoodBeijingStyle();   //返回北京特色的中餐
}
public override WestFood CreateWestFood()
{
return new WestFoodBeijingStyle();  //返回北京特色的西餐
}
}
//新增的“分工厂” 子类WashingtonFactory负责实现华盛顿特色产品的创建
public class WashingtonFactory : AbstractFactory
{
public override ChineseFood CreateChineseFood()
{
return new ChineseFoodWashingtonStyle();    //返回华盛顿特色的中餐
}
public override WestFood CreateWestFood()
{
return new WestFoodWashingtonStyle();   //返回华盛顿特色的西餐
}
}

//中餐 抽象类
public abstract class ChineseFood
{
public abstract void Print();
}
//西餐 抽象类
public abstract class WestFood
{
public abstract void Print();
}

//原来的需求
//中餐 北京特色 具体类
public class ChineseFoodBeijingStyle : ChineseFood
{
public override void Print()
{
Console.WriteLine("北京特色的中餐!");
}
}
//西餐 北京特色 具体类
public class WestFoodBeijingStyle : WestFood
{
public override void Print()
{
Console.WriteLine("北京特色的西餐!");
}
}

//新增的需求
//中餐 华盛顿特色 具体类
public class ChineseFoodWashingtonStyle : ChineseFood
{
public override void Print()
{
Console.WriteLine("华盛顿特色的中餐!");
}
}
//西餐 华盛顿特色 具体类
public class WestFoodWashingtonStyle : WestFood
{
public override void Print()
{
Console.WriteLine("华盛顿特色的西餐!");
}
}

//程序调用入口(Main方法)
class Program
{
static void Main(string[] args)
{
//原来的需求
AbstractFactory beijingFactory = new BeijingFactory();
beijingFactory.CreateChineseFood().Print();
beijingFactory.CreateWestFood().Print();
//新增的需求
AbstractFactory washingtonFactory = new WashingtonFactory();
washingtonFactory.CreateChineseFood().Print();
washingtonFactory.CreateWestFood().Print();
Console.ReadKey();
}
}


抽象工厂对于系列产品的变化支持 “开放——封闭”原则(指的是要求系统对扩展开放,对修改封闭),扩展起来非常简便,但对于添加新产品这种情况就不支持”开放——封闭 “原则。

抽象工厂允许客户使用抽象的接口来创建一组相关产品,而不需要知道或关心实际生产出的具体产品是什么。这样客户就可以从具体产品中被解耦。

抽象工厂模式很难支持新种类产品的变化。这是因为抽象工厂接口中已经确定了可以被创建的产品集合,如果需要添加新产品,此时就必须去修改抽象工厂的接口,这样就涉及到抽象工厂类的以及所有子类的改变,这样也就违背了“开发——封闭”原则。

也就是说抽象工厂的使用范围是:

某个具体工厂需要负责已确定的一系列产品(多元化)的创建工作。

(参考)

一个系统不要求依赖产品类实例如何被创建、组合和表达的表达,这点也是所有工厂模式应用的前提。

这个系统有多个系列产品,而系统中只消费其中某一系列产品

系统要求提供一个产品类的库,所有产品以同样的接口出现,客户端不需要依赖具体实现。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: