设计模式(1)抽象工厂模式
模式介绍
抽象工厂模式是一种创建模式,它定义接口来创建相关对象族,而不指定它们的实际实现。
使用此模式时,你将创建返回许多相关对象的工厂。这种模式实现了更大的体系结构,如依赖注入。
示例
比如有Sandwich(三明治) 和 Dessert(甜点)
adults(成人)和 kids(小孩)喜欢吃的都不一样
抽象的Sandwich 和 Dessert
/// <summary>
/// An abstract object.
/// </summary>
abstract class Sandwich { }
/// <summary>
/// An abstract object.
/// </summary>
abstract class Dessert { }
具体的Sandwich 和 具体的Dessert
/// <summary>
/// A ConcreteProduct
/// </summary>
class BLT : Sandwich { }
/// <summary>
/// A concrete object
/// </summary>
class GrilledCheese : Sandwich { }
/// <summary>
/// A ConcreteProduct
/// </summary>
class CremeBrulee : Dessert { }
/// <summary>
/// A concrete object
/// </summary>
class IceCreamSundae : Dessert { }
抽象工厂:声明抽象方法,用于创建Sandwich 和 Dessert
/// <summary>
/// The AbstractFactory class, which defines methods for creating abstract objects.
/// </summary>
abstract class RecipeFactory
{
public abstract Sandwich CreateSandwich();
public abstract Dessert CreateDessert();
}
成人烹饪工厂:继承抽象工厂
/// <summary>
/// A ConcreteFactory which creates concrete objects by implementing the abstract factory's methods.
/// </summary>
class AdultCuisineFactory : RecipeFactory
{
public override Sandwich CreateSandwich()
{
return new BLT();
}
public override Dessert CreateDessert()
{
return new CremeBrulee();
}
}
小孩烹饪工厂:继承抽象工厂
/// <summary>
/// A concrete factory which creates concrete objects by implementing the abstract factory's methods.
/// </summary>
class KidCuisineFactory : RecipeFactory
{
public override Sandwich CreateSandwich()
{
return new GrilledCheese();
}
public override Dessert CreateDessert()
{
return new IceCreamSundae();
}
}
客户端调用:
class Program
{
static void Main(string[] args)
{
Console.WriteLine("Who are you? (A)dult or (C)hild?");
char input = Console.ReadKey().KeyChar;
RecipeFactory factory;
switch(input)
{
case 'A':
factory = new AdultCuisineFactory();
break;
case 'C':
factory = new KidCuisineFactory();
break;
default:
throw new NotImplementedException();
}
var sandwich = factory.CreateSandwich();
var dessert = factory.CreateDessert();
Console.WriteLine("\nSandwich: " + sandwich.GetType().Name);
Console.WriteLine("Dessert: " + dessert.GetType().Name);
Console.ReadKey();
}
}
源代码
https://github.com/exceptionnotfound/DesignPatterns/tree/master/AbstractFactory
原文
https://www.exceptionnotfound.net/the-daily-design-pattern-abstract-factory/