这个嘛。。。有点像工厂方法模式的升级版,但是又不太像。
这个模式里面有两个名词,一个是产品族,一个是产品等级结构。这两个词的意思呢。。。打个比方~
比如商场里面卖家用电器,比如有电视机,电冰箱,洗衣机什么的,品牌有海尔,海信等等。
然后产品族呢,就是指这个商场里面所有的电冰箱或者所有洗衣机,就是同一种类型的家用电器。
产品等级结构就是指这个商场里面所有的海尔牌的家用电器,也就是同一种品牌的。
所以跟工厂方法模式不同的是,这里面的一个工厂不再局限于一种产品,而是产生一族的产品,其余的没有太大改变。仍然分抽象工厂(既所有具体工厂的父类),具体工厂,抽象产品,具体产品
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace AbstractFactory
{
abstract class Factory//抽象工厂
{
public abstract ProductA CreateProdcctA();
public abstract ProductB CreateProductB();
}
class Factory1:Factory//具体工厂1
{
public override ProductA CreateProdcctA()
{
ProductA1 PA1 = new ProductA1();
return PA1;
}
public override ProductB CreateProductB()
{
ProductB1 PB1 = new ProductB1();
return PB1;
}
}
class Factory2 : Factory//具体工厂2
{
public override ProductA CreateProdcctA()
{
ProductA2 PA2 = new ProductA2();
return PA2;
}
public override ProductB CreateProductB()
{
ProductB2 PB2 = new ProductB2();
return PB2;
}
}
class ProductA//产品结构等级A的基类
{
}
class ProductA1:ProductA
{
public ProductA1()
{
Console.WriteLine(this);
}
}
class ProductA2:ProductA
{
public ProductA2()
{
Console.WriteLine(this);
}
}
class ProductB//产品结构等级B的基类
{
}
class ProductB1 : ProductB
{
public ProductB1()
{
Console.WriteLine(this);
}
}
class ProductB2 : ProductB
{
public ProductB2()
{
Console.WriteLine(this);
}
}
class Program
{
static void Main(string[] args)
{
Factory f;
f = new Factory1();
ProductA PA=f.CreateProdcctA();//因为调用的是生成A类产品 所以用ProductA的变量
Console.WriteLine(PA);//看生成结果
}
}
}
因为这种结构,所以这种模式的优缺点也比较明显。
优点:增加产品族比较方便
相对于工厂方法模式,不再是一对一的关系,比较方便,节省空间
当一个产品线的多个对象在使用时,能保证他们是同一个族
缺点:增加新的产品等级结构相当麻烦。。。
使用条件:设计完之后不会向系统增加新的产品等级结构
属于同一个族的产品将一起使用