创建一组产品,把实现具体产品创建推迟到子类中。不需要关心实际生产的具体产品是什么。
上回,我们说到屌丝小明同学。凭借一个蛋糕成功取得了女神的青睐,答应交往。今天是他们第一次进行约会。
小明同学单身狗太久,不知道应该怎么办。所以他下载了恋爱管家APP。
PS:恋爱管家是我正在开发中的一款APP和微信订阅号,到时候开发完整,第一时间在博客园告知,并发布源码。
选择了恋爱计划A,带女神吃饭、看电影、嘿嘿嘿。完成了完美的第一次约会。
恋爱计划分两步。第一吃饭,第二看电影。接下来,我们试着用抽象工厂,完成这个剧情。
首先创建一个电影的抽象类。
public abstract class Movie { public abstract void GoMovie(); }
接下来,我们分别创建两家影院来提供。一家是UME,一家是万达国际影城
public class UMEMovie : Movie { public override void GoMovie() { Console.WriteLine("出发去UME国际影城,看电影"); } } public class WanDaMovie : Movie { public override void GoMovie() { Console.WriteLine("出发去万达国际影城,看电影"); } }
这里我们看电影的准备,就可以OK了。接下来我们准备吃饭
首先创建一个吃饭的抽象类
public abstract class Eat { public abstract void GoEat(); }
接下来,我们分别创建肯德基和麦当劳来提供服务。
public class Mc : Eat { public override void GoEat() { Console.WriteLine("出发去麦当劳,吃饭"); } } public class Kfc : Eat { public override void GoEat() { Console.WriteLine("出发去肯德基,吃饭"); } }
代码很简单,不多说别的。这里我们的吃饭必要条件就算完成了。
创建恋爱管家抽象类
public abstract class LoveManageApp { public abstract Movie ReadMovie(); public abstract Eat ReadEat(); }
不管A计划和B计划,都实现看电影和吃饭两个功能。下面我们来制定A、B计划
public class LoveManageA : LoveManageApp { public override Eat ReadEat() { return new Mc(); } public override Movie ReadMovie() { return new UMEMovie(); } } public class LoveManageB : LoveManageApp { public override Eat ReadEat() { return new Kfc(); } public override Movie ReadMovie() { return new WanDaMovie(); } }
A计划,去麦当劳吃饭然后去UME。B计划,去肯德基吃饭然后去万达影城。代码很简单,不多说。
至此,约会必要的条件已经构成。我们让小明同学制定A计划进行约会。
static void Main(string[] args) { Console.WriteLine("小明第一次跟女神约会"); Console.WriteLine("由于小明是个小屌丝,所以他使用了恋爱管家APP帮助他制定的A计划"); LoveManageApp app = new LoveManageA(); Console.WriteLine("A计划开始"); Console.WriteLine("我们先吃个饭吧"); Eat eat = app.ReadEat(); eat.GoEat(); Console.WriteLine("我们看个电影吧"); Movie mo = app.ReadMovie(); mo.GoMovie(); Console.WriteLine("我们嘿嘿嘿吧...........啪~~~...我擦真打啊.."); Console.ReadLine(); }
抽象工厂和工厂模式最大的区别,就是抽象工厂可以创建一组产品。而且符合开闭原则。
常用场景:一个接口可以提供一个产品组,且不必知道产品的具体实现
选择关键点:产品组是否需要一起提供,且是否有一致的接口。
By~