设计模式C#合集--抽象工厂模式
抽象工厂,名字就告诉你是抽象的了。上代码。
public interface BMW { public void Drive(); } public class BMW730 : BMW { public override void Drive() { Console.WriteLine("BMW 730 Run"); } } public class BMWX6 : BMW { public override void Drive() { Console.WriteLine("BMW X6 Run"); } } public interface Porsche { public void Drive(); } public class PorscheMacan : Porsche { public override void Drive() { Console.WriteLine("Porsche Macan"); } } public class PorschePanamera : Porsche { public override void Drive() { Console.WriteLine("Porsche Panamera"); } }
似乎之前的打招呼不够用了,我们就弄了一堆车吧。首先有两个接口:宝马和保时捷,宝马和保时捷又有具体车型。
工厂的代码:
public interface IFactory { public BMW CreatorBMW(); public Porsche CreatorPorsche(); } public class SUVFactory : IFactory { public override BMW CreatorBMW() { return new BMWX6(); } public override Porsche CreatorPorsche() { return new PorscheMacan(); } } public class CarFactory : IFactory { public override BMW CreatorBMW() { return new BMW730(); } public override Porsche CreatorPorsche() { return new PorschePanamera(); } }
首先接口IFactory提供了两个方法,一个是产生宝马,一个是产生保时捷,两个实现类SUVFactory、CarFactory中实现了两个方法,为什么采用这种构造呢?因为到BMW730、BMWX6、PorscheMacan、PorschePanamera这四个是具体的类,他们可以分类,我采用了车型的分类,BMW730和PorschePanamera属于轿车,而PorscheMacan、BMWX6属于SUV,对应的工厂类也就生成对应的车,当然,也可以按照牌子分,比如生成BMWFactory工厂类,实例化属于BMW的对象,或者按价格分,相对贵的,相对便宜的等等。总而言之,分类的规则是由接口IFactory确定的。所以抽象工厂的局限性也就出来了。