温故而知新:设计模式之工厂模式(Factory)
工厂模式:个人理解为主要用于创建"同一系列"的N个对象实例。(注意这里"同一系列"指这一系列对象均继承于某一个抽象类或均实现了某一个接口)
举例:(仍然来自李建忠老师webcast中的实例,不过做了些简化)
某汽车生产商需要对生产出来的“某一品牌”的不同型号汽车进行测试,于是写一套测试程序,这里的品牌我们就用Audi(奥迪)吧,比如现在测试的是A5,过一阵可能A6要下线,另外A7,A8...也都在研究中...
如何让这一套测试程序能应对各种型号的变化,而不是每次出来一款新型号的奥迪,就要发布一个版本?
寻找变化点:变化的只是型号,但同一品牌的测试方式却相对不变(比如商务车通常主要侧重于测试商务实用性,跑车通常主要侧重于测试引擎性能,环保概念车主要测试能耗,豪华车侧重于内部装饰...),所以只需要把同一类测试方法提出来即可
1 using System;
2
3 namespace FactoryMethod
4 {
5 class Program
6 {
7 static void Main(string[] args)
8 {
9 AudiFactory f = new A5Factory();//利用反射可完全解除 客户程序 与具体类型的依赖,此处略过...
10 Audi a = f.CreateAudi();
11 a.Test();
12 Console.ReadKey();
13 }
14 }
15
16 #region "接口/抽象"部分
17 public abstract class Audi
18 {
19 public abstract void Test();
20 }
21
22
23 public abstract class AudiFactory
24 {
25 public abstract Audi CreateAudi();
26 }
27 #endregion
28
29
30 #region 实现部分
31 public class A5Factory : AudiFactory
32 {
33 public override Audi CreateAudi()
34 {
35 return new AudiA5();
36 }
37 }
38
39 public class A6Factory : AudiFactory
40 {
41 public override Audi CreateAudi()
42 {
43 return new AudiA6();
44 }
45 }
46
47 public class AudiA5 : Audi
48 {
49 public override void Test()
50 {
51 Console.WriteLine("Audi A5 测试完成!");
52 }
53 }
54
55 public class AudiA6 : Audi
56 {
57 public override void Test()
58 {
59 Console.WriteLine("Audi A6 测试完成!");
60 }
61 }
62 #endregion
63 }
64
2
3 namespace FactoryMethod
4 {
5 class Program
6 {
7 static void Main(string[] args)
8 {
9 AudiFactory f = new A5Factory();//利用反射可完全解除 客户程序 与具体类型的依赖,此处略过...
10 Audi a = f.CreateAudi();
11 a.Test();
12 Console.ReadKey();
13 }
14 }
15
16 #region "接口/抽象"部分
17 public abstract class Audi
18 {
19 public abstract void Test();
20 }
21
22
23 public abstract class AudiFactory
24 {
25 public abstract Audi CreateAudi();
26 }
27 #endregion
28
29
30 #region 实现部分
31 public class A5Factory : AudiFactory
32 {
33 public override Audi CreateAudi()
34 {
35 return new AudiA5();
36 }
37 }
38
39 public class A6Factory : AudiFactory
40 {
41 public override Audi CreateAudi()
42 {
43 return new AudiA6();
44 }
45 }
46
47 public class AudiA5 : Audi
48 {
49 public override void Test()
50 {
51 Console.WriteLine("Audi A5 测试完成!");
52 }
53 }
54
55 public class AudiA6 : Audi
56 {
57 public override void Test()
58 {
59 Console.WriteLine("Audi A6 测试完成!");
60 }
61 }
62 #endregion
63 }
64
这里再给出一个计算器的工厂模式示例(来自大话模式中的示例) https://files.cnblogs.com/yjmyzz/Calculator_FactoryMethod.rar
作者:菩提树下的杨过
出处:http://yjmyzz.cnblogs.com
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。
出处:http://yjmyzz.cnblogs.com
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。