工厂模式
简单工场模式
>int prodNo;
public SimpleFactory(int prodNo) //构造工厂时告知工厂产品标识
{
this.prodNo = prodNo;
}
public IProduct GetProduct()
{
switch (prodNo) //根据产品标识生产产品
{
default:
return new ProductA();
case 1:
return new ProductA();
case 2:
return new ProductB();
}
}
}
//产品A
class ProductA: IProduct
{
//产品属性
//......
}
//产品B
class ProductB : IProduct
{
//产品属性
//......
}
//产品接口
interface IProduct
{
//产品方法
//......
}
简单工厂通过构造时传入的标识来生产产品,不同的产品都在同一个工场中生产,这种判断会随着产品的增加而增加,给扩展和维护带来麻烦
工场模式
interface IFactory //工厂接口
{
IProduct GetProduct();
}
//A工厂类
public class FactoryA: IFactory
{
IProduct productA;
public FactoryA()
{
this.productA = new ProductA();
}
public IProduct GetProduct() //A工厂生产A产品
{
return this.productA;
}
}
//B工厂类
public class FactoryB : IFactory
{
IProduct productB;
public FactoryB()
{
this.productB = new ProductB();
}
public IProduct GetProduct() //B工厂生产B产品
{
return this.productB;
}
}
//产品接口
public interface IProduct
{
//产品方法
//......
}
//产品A
public class ProductA : IProduct
{
//产品属性
//......
}
//产品B
public class ProductB : IProduct
{
//产品属性
//......
}
这里已经将工厂类分开,不再将所有产品在同一工场中生产,这样就解决了简单工场中不停的switch case的问题,如果说来了一个C产品,那么我们只需要写一个C工厂和C产品,在调用C工厂生产C产品即可,工场模式无法解决产品族和产品等级结构的问题
何谓产品族和产品等级结构。举个例子来说,比如三星是一个品牌,三星生产洗衣机,电视,冰箱;格力也是一个品牌,格力也生产洗衣机,电视,冰箱。那么,三星工厂和格力工厂生产的2个品牌的洗衣机,就在洗衣机这种产品的产品等级结构中(当然洗衣机产品等级结构中还有LG,海尔,三菱等等不同的品牌的工厂的产品),所以,洗衣机就是一个产品等级。那么三星生产的三星洗衣机,三星电视机,三星冰箱就是三星这个工厂的产品族。可能还会有西门子工厂产品族,格力工厂产品族,美的工厂产品族等等。
抽象工厂模式
//工厂接口,即抽象工厂
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
}
在工厂模式中,一个工厂生产一个产品,所有的具体产品是由同一个抽象工厂派生的,不存在产品等级结构和产品族类的概念,在抽象工厂中,同一个等级的产品是派生于一个抽象产品(即产品接口),一个抽象工厂派生不同的具体工厂,每个具体的工厂生产自己族类的产品.所以我们得到4个结论:工厂模式中,一个工厂生产一个产品,所有产品派生于同一个产品抽象(产品接口);而抽象工厂模式中,一个工厂生产多个产品,他们是一个产品族,不同的产品族派生于不同的抽象产品(产品接口)