工厂模式
简单工场模式
>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个结论:工厂模式中,一个工厂生产一个产品,所有产品派生于同一个产品抽象(产品接口);而抽象工厂模式中,一个工厂生产多个产品,他们是一个产品族,不同的产品族派生于不同的抽象产品(产品接口)