09-抽象工厂
1. 简介
与工厂方法的区别: 工厂方法模式是为了克服简单工厂模式的缺点而设计出来的,简单工厂模式的工厂类随着产品类的增加需要增加额外的代码,而工厂方法模式每个具体工厂类只完成单个实例的创建,所以它具有很好的可扩展性。
但是在现实生活中,一个工厂只创建单个产品这样的例子很少,因为现在的工厂都多元化了,一个工厂创建一系列的产品,如果我们要设计这样的系统时,工厂方法模式显然在这里不适用,然后抽象工厂模式却可以很好地解决一系列产品创建的问题。
2. 模拟场景
上帝(工厂)不但要造人,还要各种衣服 ,不同类别的人传的衣服不同, 抽象出一个共同的工厂,约束公共的行为,其他工厂继承他。
1 public abstract class AbstractFactory 2 { 3 public abstract IPeople CreatePeople(); 4 public abstract ICloses CreateClose(); 5 6 }
1 public class ChineseFactory : AbstractFactory 2 { 3 public override ICloses CreateClose() 4 { 5 return new Close1(); 6 } 7 8 public override IPeople CreatePeople() 9 { 10 return new Chinese(); 11 } 12 }
1 public class JanpaneseFactory : AbstractFactory 2 { 3 public override ICloses CreateClose() 4 { 5 return new Close3(); 6 } 7 8 public override IPeople CreatePeople() 9 { 10 return new Janpanese(); 11 } 12 }
1 public class AmericaFactory : AbstractFactory 2 { 3 public override ICloses CreateClose() 4 { 5 return new Close2(); 6 } 7 8 public override IPeople CreatePeople() 9 { 10 return new America(); 11 } 12 }
1 static void Main(string[] args) 2 { 3 { 4 AbstractFactory ab1 = new ChineseFactory(); 5 IPeople iPeople1 = ab1.CreatePeople(); 6 ICloses iClose1 = ab1.CreateClose(); 7 iPeople1.Eating(); 8 iClose1.showClose(); 9 } 10 11 { 12 AbstractFactory ab1 = new AmericaFactory(); 13 IPeople iPeople1 = ab1.CreatePeople(); 14 ICloses iClose1 = ab1.CreateClose(); 15 iPeople1.Eating(); 16 iClose1.showClose(); 17 } 18 19 { 20 AbstractFactory ab1 = new JanpaneseFactory(); 21 IPeople iPeople1 = ab1.CreatePeople(); 22 ICloses iClose1 = ab1.CreateClose(); 23 iPeople1.Eating(); 24 iClose1.showClose(); 25 } 26 Console.ReadKey(); 27 28 }