抽象工厂模式角色
抽象工厂模式涉及到的系统角色
(1)抽象工厂(AbstractFactory)角色:担任这个角色的是工厂方法模式的核心,它是与应用系统的商业逻辑无关的。通常使用Java 接口或者抽象Java 类实现,而所有的具体工厂类必须实现这个Java 接口或继承这个抽象Java 类。
(2)具体工厂类(Conrete Factory)角色:这个角色直接在客户端的调用下创建产品的实例。这个角色含有选择合适的产品对象的逻辑,而这个逻辑是与应用系统的商业逻辑紧密相关的。通常使用具体Java 类实现这个角色。
(3)抽象产品(Abstract Product)角色:担任这个角色的类是工厂方法模式所创建的对象的父类,或它们共同拥有的接口。通常使用Java 接口或者抽象Java 类实现这一角色。
(4)具体产品(Concrete Product)角色:抽象工厂模式所创建的任何产品对象都是某一个具体产品类的实例。这是客户端最终需要的东西,其内部一定充满了应用系统的商业逻辑。通常使用具体Java 类实现这个角色。
产品族:一个工厂可以生产多个产品
//工厂接口,即抽象工厂
interface IFactory
{
IFridge CreateFridge();
IAirCondition CreateAirCondition();
}
//三星的工厂,生产三星的产品族
public class SamsungFactory : IFactory
{
public IAirCondition CreateAirCondition()
{
return new SamsungAirCondition(); //三星的工厂生产三星的空调
}
public IFridge CreateFridge()
{
return new SamsungFridge(); //三星的工厂生产三星的冰箱
}
}
//格力的工厂,生产格力的产品族
public class GreeFactry : IFactory
{
public IAirCondition CreateAirCondition()
{
return new GreeAirCondition(); //格力的工厂生产格力的空调
}
public IFridge CreateFridge()
{
return new GreeFridge(); //格力的工厂生产格力的冰箱
}
}
//冰箱产品接口
public interface IFridge
{
//冰箱产品接口
//冰箱的action
}
//空调接口
public interface IAirCondition
{
//空调产品接口
//空调的action
}
//三星的冰箱
public class SamsungFridge: IFridge
{
//三星冰箱的action和property
}
//格力的冰箱
public class GreeFridge : IFridge
{
//格力冰箱的action和property
}
//三星的空调
public class SamsungAirCondition : IAirCondition
{
//三星空调的action和property
}
//格力的空调
public class GreeAirCondition : IAirCondition
{
//格力空调的action和property
}
我们可以看到,在工厂模式中,一个工厂生产一个产品,所有的具体产品是由同一个抽象产品派生的,不存在产品等级结构和产品族的概念;而在抽象工厂中,同一个等级的产品是派生于一个抽象产品(即产品接口),一个抽象工厂派生不同的具体工厂,每个具体工厂生产自己的产品族(包含不同产品等级)。所以我们得到第四个结论,工厂模式中,一个工厂生产一个产品,所有产品派生于同一个抽象产品(或产品接口);而抽象工厂模式中,一个工厂生产多个产品,它们是一个产品族,不同的产品族的产品派生于不同的抽象产品(或产品接口)。