创建型模式隐藏了类的实例的创建细节,通过隐藏对象如何被创建和组合在一起达到使整个系统独立的目的。 创建型模式分为:工厂方法模式(Factory Method)、抽象工厂模式
(Abstract Factory)、建造者模式(Builder)、原型模式(Prototype)、单例模式(Singleton)等五类。
本文以Factory Method 模式为例,阐述工厂方法模式的工作原理:
工厂方法模式(Factory Method Pattern):也叫虚拟构造器(Virtual Constructor)模式或者多
态工厂(Polymorphic Factory)模式,在工厂方法模式中,工厂父类负责定义创建产品对象的
公共接口,而工厂子类则负责生成具体的产品对象,这样做的目的是将产品类的实例化操作
延迟到工厂子类中完成。它的 UML 类图如下:
工厂方法模式包含如下角色:
Product:抽象产品
ConcreteProduct:具体产品
Creator:抽象工厂
Concrete Creator:具体工厂
Factory Method 模式的特点为当系统扩展需要添加新的产品对象时,仅仅需要添加一个 具体产品对象以及一个具体工厂对象,原有工厂对象不需要进行任何修改,也不需要修改客户端,很好地符合了“开闭原则” 。
应用实例:
用 Factory Method 模式设计一个饮料工厂的模拟程序:要求为每种品牌的饮料提供一个子工厂,如:芒果汁工厂专门负责生产芒果汁,苹果汁工厂专门负责生产苹果汁,如果需要生产桃子汁或菠萝汁,只需要对应增加一个新的桃子汁工厂或菠萝汁工厂即可,原有的工厂无须做任何修改,使得整个系统具有更加的灵活性和可扩展性。
命名空间为DrinkFactorySample:
1. 抽象产品类Drink(饮料类)
namespace DrinkFactorySample
{
public interface Drink //可以是一个接口,也可以是一个抽象类
{
void drink();
}
}
2. 具体产品类MangguoDrink(芒果汁饮料类)
namespace DrinkFactorySample
{
public class MangguoDrink : Drink
{
public void drink()
{
Console.WriteLine("芒果汁饮料正在被人们饮用");
}
}
}
3. 具体产品类AppleDrink(苹果汁饮料类)
namespace DrinkFactorySample
{
public class AppleDrink : Drink
{
public void drink()
{
Console.WriteLine("苹果汁饮料正在被人们饮用");
}
}
}
4. 抽象工厂类DrinkFactory(饮料工厂类)
namespace DrinkFactorySample
{
public interface DrinkFactory //可以是一个接口,也可以是一个抽象类
{
Drink produceDrink();
}
}
5.具体工厂类MangguoDrinkFactory(芒果汁饮料工厂类)
namespace DrinkFactorySample
{
public class MangguoDrinkFactory : DrinkFactory
{
public Drink produceDrink()
{
//生产饮料
Console.WriteLine("芒果汁工厂正在生产芒果汁饮料");
Drink DDrink = new MangguoDrink();
return DDrink;
}
}
}
6.具体工厂类AppleDrinkFactory(苹果汁饮料工厂类)
namespace DrinkFactorySample
{
public class AppleDrinkFactory : DrinkFactory
{
public Drink produceDrink()
{
//生产饮料
Console.WriteLine("苹果汁工厂正在生产苹果汁饮料");
Drink DDrink = new AppleDrink();
return DDrink;
}
}
}
7.测试: 测试类Client:
namespace DrinkFactorySample
{
class Client
{
static void Main(string[] args)
{
DrinkFactory factory;
Drink drinks;
factory = new MangguoDrinkFactory();
drinks = factory.produceDrink();
drinks.drink();
Console.Read();
}
}
}
运行结果: