技术开发 频道

C#中23个经典设计模式(1)

意图

          【IT168  技术文档】 在《Design Patterns》一书中,ABSTRACT FACTORY(图省事以下用AF代替了)模式是第一个被介绍的模式,个人以为AF模式也是最容易理解的模式之一。 
          《Design Patterns》中,对AF模式的描述是这样的:提供一个创建一系列相关或相互依赖对象的接口,而无需指定它们具体的类。用通俗一点的话说:有一个对象,它可以创建一堆一系列的其他对象,每个系列的对象是从一个基类派生的。个人觉得,这些所谓的意图理解不理解问题都不是很大,知道什么时候应该使用什么模式就够了,这就叫“只能意会,不能言传”。

别名

           Kit ,这个别名用途不大,现在基本都是用AF称呼这个模式,很少有使用Kit的。

实现 

           有一些类表示一个“产品”的“同功能,不同类型的部件”,我们的应用中要使用这些类,由于OOP的多态性为了方便使用,基本是要靠派生的:

 1//一系列的“喇叭”,估计这个说吧,最后一个是外星语的
 2//它们都从Speaker派生,这是废话
 3public class Speaker {
 4    virtual public string SayHi() {
 5        return "Hello";
 6    }

 7}

 8
 9public class ChineseSpeaker : Speaker {
10    public override string SayHi() {
11        return "你好";
12    }

13}

14
15public class FjidjSpeaker : Speaker {
16    public override string SayHi() {
17        return "%F&*#";    
18}

19}
            光有这样一些类虽然也可以使用AF模式,但是这样似乎没有什么意义,AF模式经常要制作几个系列的对象,那几个系列的对象还要有逻辑上的关系,否则不但不会起到应有的作用还能使程序变得更加恶心。再定义一组“部件”:
 1//构造一块屏幕,代码没什么意思
 2public class Screen {
 3    virtual public string Display() {
 4        return "This is Screen";
 5    }

 6}

 7
 8public class ChineseScreen : Screen {
 9    public override string Display() {
10        return "这是屏幕";
11    }

12}

13
14public class FfdhkScreen : Screen {
15    public override string Display() {
16        return "SF&*&*#%";
17    }

18}

        现在有了两个“部件”了,一个喇叭,一个屏幕。我们需要把这个东西组成一个“产品”,考虑以下事实:每一中产品中的喇叭和屏幕必须是对应的(其实也可以混合,不过这样......),假设这个产品叫做"xToy“,那就应该有一个给我这种英文盲使用的"ChineseXtoy"和给外星人使用的"DFxToy”,标准的是英文版的"xToy"。
//一个更加无聊的类,甚至唯一的Play()方法都毫无意义(还是错误的)
//但是,能够说明问题就好了
public class xToy {
    
public xToy(Speaker sp, Screen scr) {
        _speaker 
= sp;
        _screen 
= scr;
    }
   

    
public void Play() {
        _speaker.SayHi();
        _screen.Display();
    }


    
private Speaker _speaker;
    
private Screen _screen;
}
   由于OOP的多态性,我们不需要为中文版和外星版创建子类了,只要改变传入的Speaker对象和Scrren对象就好。看起来像这样:
//标准版
xToy std = new xToy(new Speaker(), new Screen() );

//中文版
xToy c = new xToy(new ChineseSpeaker(), new Chinese());

//外星版
xToy f = new xToy(new FjidjSpeaker(), new FfjhkScreen());

//同时我们可以创建一个“疯狂”版
xToy cray = new xToy(new ChineseSpeaker(), new FfjhkScreen());

0
相关文章