温故而知新:设计模式之工厂模式(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 

这里再给出一个计算器的工厂模式示例(来自大话模式中的示例) https://files.cnblogs.com/yjmyzz/Calculator_FactoryMethod.rar 

posted @ 2010-01-21 15:59  菩提树下的杨过  阅读(552)  评论(1编辑  收藏  举报