用户需求:
用程序模拟以下产品线并代码实现
设计思路:
1.UML图
2.采用抽象工厂模式,将具体产品从客户代码中分离,容易改变产品的系列,能将一个系列的产品族统一到一起创建。
具体代码实现:
1.抽象工厂模式实现类
1 using System; 2 using System.Collections.Generic; 3 using System.Linq; 4 using System.Web; 5 6 namespace 设计模式作业 7 { 8 public class MyClass 9 { 10 public interface Burger { 11 string getBurger(); 12 } 13 public class KFCBurger :Burger{ 14 public string getBurger() { 15 16 return "我是KFC的巨无霸汉堡"; 17 18 } 19 } 20 public class MCBurger : Burger { 21 public string getBurger() 22 { 23 24 return "我是McDonalds的巨无霸汉堡"; 25 } 26 } 27 public interface Chicken { 28 string getChicken(); 29 } 30 public class KFCChicken : Chicken { 31 public string getChicken() 32 { 33 34 return "我是来自KFC的炸鸡"; 35 36 } 37 } 38 public class MCChicken : Chicken { 39 public string getChicken() 40 { 41 42 return "我是来自McDonalds的炸鸡"; 43 44 } 45 } 46 public interface Drink { 47 string getDrink(); 48 } 49 public class KFCDrink : Drink { 50 public string getDrink() 51 { 52 53 return "我是来自KFC的咖啡"; 54 55 } 56 } 57 public class MCDrink : Drink { 58 public string getDrink() 59 { 60 return "我是来自McDonalds的橙汁"; 61 62 } 63 } 64 public interface AbstractFactory { 65 Burger createBurger(); 66 Chicken createChicken(); 67 Drink createDrink(); 68 } 69 public class KFCFactory : AbstractFactory { 70 public Burger createBurger() { 71 return new KFCBurger(); 72 } 73 public Chicken createChicken() { 74 return new KFCChicken(); 75 } 76 public Drink createDrink() { 77 return new KFCDrink(); 78 } 79 80 } 81 public class MCFactory : AbstractFactory 82 { 83 public Burger createBurger() 84 { 85 return new MCBurger(); 86 } 87 public Chicken createChicken() 88 { 89 return new MCChicken(); 90 } 91 public Drink createDrink() 92 { 93 return new MCDrink(); 94 } 95 96 } 97 98 99 } 100 }
2.KFC生产线实现
1 using System; 2 using System.Collections.Generic; 3 using System.Linq; 4 using System.Web; 5 using System.Web.UI; 6 using System.Web.UI.WebControls; 7 8 namespace 设计模式作业 9 { 10 public partial class WebForm1 : System.Web.UI.Page 11 { 12 13 MyClass.AbstractFactory af = new MyClass.KFCFactory(); 14 15 protected void Page_Load(object sender, EventArgs e) 16 { 17 18 } 19 20 protected void Button1_Click(object sender, EventArgs e) 21 { 22 MyClass.Burger kfcburger = af.createBurger(); 23 Label1.Text = kfcburger.getBurger(); 24 25 26 } 27 28 protected void Button2_Click(object sender, EventArgs e) 29 { 30 MyClass.Chicken kfcckicken = af.createChicken(); 31 Label1.Text = kfcckicken.getChicken(); 32 33 } 34 35 protected void Button3_Click(object sender, EventArgs e) 36 { 37 MyClass.Drink kfcdrink = af.createDrink(); 38 Label1.Text = kfcdrink.getDrink(); 39 } 40 } 41 }
3.McDonalds生产线实现
1 using System; 2 using System.Collections.Generic; 3 using System.Linq; 4 using System.Web; 5 using System.Web.UI; 6 using System.Web.UI.WebControls; 7 8 namespace 设计模式作业 9 { 10 public partial class WebForm2 : System.Web.UI.Page 11 { 12 MyClass.AbstractFactory af = new MyClass.MCFactory(); 13 protected void Page_Load(object sender, EventArgs e) 14 { 15 16 } 17 18 protected void Button1_Click(object sender, EventArgs e) 19 { 20 MyClass.Burger mcburger = af.createBurger(); 21 Label1.Text = mcburger.getBurger(); 22 23 } 24 25 protected void Button2_Click(object sender, EventArgs e) 26 { 27 MyClass.Chicken mcchicken = af.createChicken(); 28 Label1.Text = mcchicken.getChicken(); 29 30 } 31 32 protected void Button3_Click(object sender, EventArgs e) 33 { 34 MyClass.Drink mcdrink = af.createDrink(); 35 Label1.Text = mcdrink.getDrink(); 36 37 } 38 } 39 }
运行结果:
点击KFC按钮
创建KFC的汉堡类
创建KFC的鸡肉类
创建KFC的饮品类
点击McDonalds按钮
创建McDonalds的汉堡类
创建McDonalds的鸡肉类
创建McDonalds的饮品类
体会和感悟:
抽象工厂模式是所有形态的工厂模式中最为抽象和最具一般性的一种形态。抽象工厂模式是指当有多个抽象角色时,使用的一种工厂模式。抽象工厂模式可以向客户端提供一个接口,使客户端在不必指定产品的具体的情况下,创建多个产品族中的产品对象。根据里氏替换原则,任何接受父类型的地方,都应当能够接受子类型。它采用OOP和分层的思想,更好的实现程序的分离,提高程序的易扩展性。抽象工厂在产品族中增加新的产品类型较为困难,因为需要修改已有的抽象工厂类,在一定程度上违反了"开放封闭原则"。通过本次实践,我更好的理解了抽象工厂模式的实现和好处,也更加熟悉运用了c#语言,感受到了代码君的奥秘。