《软件架构与设计模式》关于 抽象工厂模式 的一个小例子
下面是题目的要求:
根据上面的要求,我首先是画出了UML类图:
接着,根据上面的UML类图写出源代码:
1、抽象产品类
该类定义了产品的共性,所有的具体产品都要实现这个类
1 abstract class Burger 2 { 3 public abstract void EatBurger(); 4 } 5 6 7 abstract class Chicken 8 { 9 public abstract void EatChicken(); 10 } 11 12 13 abstract class Drink 14 { 15 public abstract void EatDrink(); 16 }
2、具体产品类
决定了产品在客户端中的具体行为
1 class KFCBurger : Burger 2 { 3 public override void EatBurger() 4 { 5 Console.WriteLine("I am eating KFC Burger"); 6 } 7 } 8 9 class McDonaldBurger : Burger 10 { 11 public override void EatBurger() 12 { 13 Console.WriteLine("i am eating McDonald Burger"); 14 } 15 } 16 17 class KFCChicken : Chicken 18 { 19 public override void EatChicken() 20 { 21 Console.WriteLine("i am eating KFC Chicken"); 22 } 23 } 24 25 class McDonaldChicken : Chicken 26 { 27 public override void EatChicken() 28 { 29 Console.WriteLine("i am eating McDonlad Chicken"); 30 } 31 } 32 33 34 35 class KFCDrink : Drink 36 { 37 public override void EatDrink() 38 { 39 Console.WriteLine("i am eating KFC Drink"); 40 } 41 } 42 43 class McDonaldDrink : Drink 44 { 45 public override void EatDrink() 46 { 47 Console.WriteLine("i am eating McDonlad Drink"); 48 } 49 }
3、抽象工厂类
定义了具体工厂必须实现的接口
1 interface IFactory 2 { 3 Burger MakeBurger(); 4 Chicken MakeChicken(); 5 Drink MakeDrink(); 6 }
4、具体工厂类
实现了如何具体的创建产品类
class KFCFactory : IFactory { public Burger MakeBurger() { return new KFCBurger(); } public Chicken MakeChicken() { return new KFCChicken(); } public Drink MakeDrink() { return new KFCDrink(); } } class McDonaldFactory : IFactory { public Burger MakeBurger() { return new McDonaldBurger(); } public Chicken MakeChicken() { return new McDonaldChicken(); } public Drink MakeDrink() { return new McDonaldDrink(); } }
5、product 套餐类
class Product { private Burger _burger; private Chicken _chicken; private Drink _drink; public Burger burger { get { return _burger; } set { _burger = value; } } public Chicken chicken { get { return _chicken; } set { _chicken = value; } } public Drink drink { get { return _drink; } set { _drink = value; } } public void eatbypeople() { _burger.EatBurger(); _chicken.EatChicken(); _drink.EatDrink(); Console.WriteLine("实在是太好吃了!"); } }
6、客户端代码
1 IFactory factory = null; 2 3 Console.Write("请根据不同的 K/M ,来选择不同品牌的套餐"); 4 string Select = Console.ReadLine(); 5 6 switch (Select) 7 { 8 case "K": 9 factory = new KFCFactory(); 10 break; 11 case "M": 12 factory = new McDonaldFactory(); 13 break; 14 } 15 16 Product product1 = new Product(); 17 product1.burger = factory.MakeBurger(); 18 product1.chicken = factory.MakeChicken(); 19 product1.drink = factory.MakeDrink(); 20 product1.eatbypeople(); 21 22 Console.ReadLine();
下面是具体的效果图:
从 简单工厂模式 到 工厂方法模式 再到现在的 抽象工厂模式
在这个过程的学习中,也体会到了各自模式的优缺点及改进的构成。
接下来谈一谈我自己的看法,欢迎大家指正。
我觉得上面的模式都是建立在 多态 的基础上实现的,
简单工厂模式以一个工厂类为核心来创建多个继承抽象产品类的具体产品类。但是工厂类的本身违背了开-闭原则
工厂方法模式就是对于简单工厂模式存在的缺点进行改进,将工厂类进行了继承,形成了抽象工厂类和具体工厂类,那么这样就符合了开-闭原则
而抽象工厂模式则是将工厂方法模式中具体工厂类中的工厂方法增多,变成了一组工厂方法。
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· .NET Core GC压缩(compact_phase)底层原理浅谈
· 现代计算机视觉入门之:什么是图片特征编码
· .NET 9 new features-C#13新的锁类型和语义
· Linux系统下SQL Server数据库镜像配置全流程详解
· 现代计算机视觉入门之:什么是视频
· 【译】我们最喜欢的2024年的 Visual Studio 新功能
· 个人数据保全计划:从印象笔记迁移到joplin
· Vue3.5常用特性整理
· 重拾 SSH:从基础到安全加固
· 为什么UNIX使用init进程启动其他进程?