设计模式之抽象工厂--(你收到信息了吗?)含源代码
先把这个小程序的内容交代清楚,不然等下被人拍砖头,这是本人学习设计模式自己练习的例子,至于有什么错误欢迎大家指正。理论的东西不想讲了,大家都会看,但是怎么弄懂呢?请慢慢看我的超级简单的例子吧
例子包含了一个抽象工厂类AbstractCompany,两个继承它的MotoCompany类和NokiaCompany类,然后产品就有我们很熟悉的手机啦,不过本人很怀念以前bb机的日子,所以加了个bb机产品,哈哈,最后客户用手机发条短信给bb机,可以吗,我说可以就可以,我的地盘我作主!开始吧,首先是公司的几个类,简单,看代码
![](/Images/OutliningIndicators/ContractedBlock.gif)
公司类
1 using System;
2 using System.Collections.Generic;
3 using System.Text;
4 using AbstractFactory.Product;
5 namespace AbstractFactory.Factory
6 {
7 abstract class AbstractCompany
8 {
9 public abstract Mobil CreateMobil(string veison);
10 public abstract BbCall CreateBbCall(string veison);
11 }
12 class MotoCompany : AbstractCompany
13 {
14 public override Mobil CreateMobil(string vesion)
15 {
16 return new MotoTelephone(vesion);
17 }
18 public override BbCall CreateBbCall(string vesion)
19 {
20 return new MotoBbCall(vesion);
21 }
22 }
23 class NokiaCompany : AbstractCompany
24 {
25 public override Mobil CreateMobil(string vesion)
26 {
27 return new NokiaTelephone(vesion);
28 }
29 public override BbCall CreateBbCall(string vesion)
30 {
31 return new NokiaBbcall(vesion);
32 }
33 }
34
35 }
36
然后是产品类,用手机和bb机,^_^
![](/Images/OutliningIndicators/ContractedBlock.gif)
手机类代码
1 using System;
2 using System.Collections.Generic;
3 using System.Text;
4
5 namespace AbstractFactory.Product
6 {
7 abstract class Mobil
8 {
9 private string _vesion;
10 public string vesion
11 {
12 get {return this._vesion; }
13
14
15 }
16 protected Mobil(string vesion)
17 {
18 this._vesion = vesion;
19
20 }
21 }
22 class MotoTelephone : Mobil
23 {
24 public MotoTelephone(string Mobilvesion):base(Mobilvesion)
25 {
26
27 }
28 }
29 class NokiaTelephone : Mobil
30 {
31 public NokiaTelephone(string Mobilvesion)
32 : base(Mobilvesion)
33 { }
34 }
35 }
36
然后是bb机咯
![](/Images/OutliningIndicators/ContractedBlock.gif)
BBcal
1 using System;
2 using System.Collections.Generic;
3 using System.Text;
4
5 namespace AbstractFactory.Product
6 {
7 abstract class BbCall
8 {
9 private string _vesion;
10 public string vesion
11 {
12 get {return this._vesion; }
13
14 }
15 protected BbCall(string vesion)
16 {
17 this._vesion = vesion;
18
19 }
20 }
21 class MotoBbCall :BbCall
22 {
23 public MotoBbCall(string vesion):base(vesion)
24 { }
25 }
26 class NokiaBbcall : BbCall
27 {
28 public NokiaBbcall(string vesion):base(vesion)
29 {
30
31 }
32 }
33 }
34
最后当然是我们最重要的客户啦,^_^
![](/Images/OutliningIndicators/ContractedBlock.gif)
客户类
1 using System;
2 using System.Collections.Generic;
3 using System.Text;
4 using AbstractFactory.Product;
5 using AbstractFactory.Factory;
6 namespace AbstractFactory.Client
7 {
8 class Customer
9 {
10
11 private Mobil mb;
12 private BbCall bb;
13 public Customer(AbstractCompany com,string vesion)
14 {
15 mb = com.CreateMobil(vesion);
16 bb = com.CreateBbCall(vesion);
17 }
18 public void Dial()
19 {
20 Console.Write("实验结果:"+bb.vesion+"牌BB机已经收到来自 "+mb.vesion+"牌手机的信息了!");
21 Console.ReadLine();
22 }
23 }
24 }
25
最后建立个控制台程序测试一下,代码如下
![](/Images/OutliningIndicators/ContractedBlock.gif)
测试
1 using System;
2 using System.Collections.Generic;
3 using System.Text;
4 namespace AbstractFactory
5 {
6 class Program
7 {
8 static void Main(string[] args)
9 {
10 for (int i = 1; i < 3; i++)
11 {
12 Console.Write("第"+i.ToString()+"次实验:请输入你想要实验的移动设备的版本序号(数字)!1:Nokia 2:Moto \n");
13 string vesion = Console.ReadLine();
14 AbstractFactory.Factory.AbstractCompany cm;
15 if (vesion.Trim() == "1")
16 {
17 cm = new AbstractFactory.Factory.NokiaCompany();
18 AbstractFactory.Client.Customer you = new AbstractFactory.Client.Customer(cm, "Nokia");
19 you.Dial();
20 }
21 else if (vesion.Trim() == "2")
22 {
23 cm = new AbstractFactory.Factory.MotoCompany();
24 AbstractFactory.Client.Customer you = new AbstractFactory.Client.Customer(cm, "Moto");
25 you.Dial();
26 }
27 else
28 {
29 Console.Write("你所输入的设备版本不存在!");
30 Console.ReadLine();
31 }
32 }
33 }
34 }
35 }
36
结果如图
![](/images/cnblogs_com/ablog-sunny/AbstractSample.jpg)
抽象工厂示例代码
例子包含了一个抽象工厂类AbstractCompany,两个继承它的MotoCompany类和NokiaCompany类,然后产品就有我们很熟悉的手机啦,不过本人很怀念以前bb机的日子,所以加了个bb机产品,哈哈,最后客户用手机发条短信给bb机,可以吗,我说可以就可以,我的地盘我作主!开始吧,首先是公司的几个类,简单,看代码
![](/Images/OutliningIndicators/ContractedBlock.gif)
![](/Images/OutliningIndicators/ExpandedBlockStart.gif)
1 using System;
2 using System.Collections.Generic;
3 using System.Text;
4 using AbstractFactory.Product;
5 namespace AbstractFactory.Factory
6 {
7 abstract class AbstractCompany
8 {
9 public abstract Mobil CreateMobil(string veison);
10 public abstract BbCall CreateBbCall(string veison);
11 }
12 class MotoCompany : AbstractCompany
13 {
14 public override Mobil CreateMobil(string vesion)
15 {
16 return new MotoTelephone(vesion);
17 }
18 public override BbCall CreateBbCall(string vesion)
19 {
20 return new MotoBbCall(vesion);
21 }
22 }
23 class NokiaCompany : AbstractCompany
24 {
25 public override Mobil CreateMobil(string vesion)
26 {
27 return new NokiaTelephone(vesion);
28 }
29 public override BbCall CreateBbCall(string vesion)
30 {
31 return new NokiaBbcall(vesion);
32 }
33 }
34
35 }
36
![](/Images/OutliningIndicators/ContractedBlock.gif)
![](/Images/OutliningIndicators/ExpandedBlockStart.gif)
1 using System;
2 using System.Collections.Generic;
3 using System.Text;
4
5 namespace AbstractFactory.Product
6 {
7 abstract class Mobil
8 {
9 private string _vesion;
10 public string vesion
11 {
12 get {return this._vesion; }
13
14
15 }
16 protected Mobil(string vesion)
17 {
18 this._vesion = vesion;
19
20 }
21 }
22 class MotoTelephone : Mobil
23 {
24 public MotoTelephone(string Mobilvesion):base(Mobilvesion)
25 {
26
27 }
28 }
29 class NokiaTelephone : Mobil
30 {
31 public NokiaTelephone(string Mobilvesion)
32 : base(Mobilvesion)
33 { }
34 }
35 }
36
![](/Images/OutliningIndicators/ContractedBlock.gif)
![](/Images/OutliningIndicators/ExpandedBlockStart.gif)
1 using System;
2 using System.Collections.Generic;
3 using System.Text;
4
5 namespace AbstractFactory.Product
6 {
7 abstract class BbCall
8 {
9 private string _vesion;
10 public string vesion
11 {
12 get {return this._vesion; }
13
14 }
15 protected BbCall(string vesion)
16 {
17 this._vesion = vesion;
18
19 }
20 }
21 class MotoBbCall :BbCall
22 {
23 public MotoBbCall(string vesion):base(vesion)
24 { }
25 }
26 class NokiaBbcall : BbCall
27 {
28 public NokiaBbcall(string vesion):base(vesion)
29 {
30
31 }
32 }
33 }
34
![](/Images/OutliningIndicators/ContractedBlock.gif)
![](/Images/OutliningIndicators/ExpandedBlockStart.gif)
1 using System;
2 using System.Collections.Generic;
3 using System.Text;
4 using AbstractFactory.Product;
5 using AbstractFactory.Factory;
6 namespace AbstractFactory.Client
7 {
8 class Customer
9 {
10
11 private Mobil mb;
12 private BbCall bb;
13 public Customer(AbstractCompany com,string vesion)
14 {
15 mb = com.CreateMobil(vesion);
16 bb = com.CreateBbCall(vesion);
17 }
18 public void Dial()
19 {
20 Console.Write("实验结果:"+bb.vesion+"牌BB机已经收到来自 "+mb.vesion+"牌手机的信息了!");
21 Console.ReadLine();
22 }
23 }
24 }
25
![](/Images/OutliningIndicators/ContractedBlock.gif)
![](/Images/OutliningIndicators/ExpandedBlockStart.gif)
1 using System;
2 using System.Collections.Generic;
3 using System.Text;
4 namespace AbstractFactory
5 {
6 class Program
7 {
8 static void Main(string[] args)
9 {
10 for (int i = 1; i < 3; i++)
11 {
12 Console.Write("第"+i.ToString()+"次实验:请输入你想要实验的移动设备的版本序号(数字)!1:Nokia 2:Moto \n");
13 string vesion = Console.ReadLine();
14 AbstractFactory.Factory.AbstractCompany cm;
15 if (vesion.Trim() == "1")
16 {
17 cm = new AbstractFactory.Factory.NokiaCompany();
18 AbstractFactory.Client.Customer you = new AbstractFactory.Client.Customer(cm, "Nokia");
19 you.Dial();
20 }
21 else if (vesion.Trim() == "2")
22 {
23 cm = new AbstractFactory.Factory.MotoCompany();
24 AbstractFactory.Client.Customer you = new AbstractFactory.Client.Customer(cm, "Moto");
25 you.Dial();
26 }
27 else
28 {
29 Console.Write("你所输入的设备版本不存在!");
30 Console.ReadLine();
31 }
32 }
33 }
34 }
35 }
36
![](/images/cnblogs_com/ablog-sunny/AbstractSample.jpg)
抽象工厂示例代码