C#中23个经典设计模式(1)
意图
【IT168 技术文档】 在《Design Patterns》一书中,ABSTRACT FACTORY(图省事以下用AF代替了)模式是第一个被介绍的模式,个人以为AF模式也是最容易理解的模式之一。
《Design Patterns》中,对AF模式的描述是这样的:提供一个创建一系列相关或相互依赖对象的接口,而无需指定它们具体的类。用通俗一点的话说:有一个对象,它可以创建一堆一系列的其他对象,每个系列的对象是从一个基类派生的。个人觉得,这些所谓的意图理解不理解问题都不是很大,知道什么时候应该使用什么模式就够了,这就叫“只能意会,不能言传”。
别名
Kit ,这个别名用途不大,现在基本都是用AF称呼这个模式,很少有使用Kit的。
实现
有一些类表示一个“产品”的“同功能,不同类型的部件”,我们的应用中要使用这些类,由于OOP的多态性为了方便使用,基本是要靠派生的:
1
//一系列的“喇叭”,估计这个说吧,最后一个是外星语的
2
//它们都从Speaker派生,这是废话
3
public class Speaker {
4
virtual public string SayHi()
{
5
return "Hello";
6
}
7
}
8
9
public class ChineseSpeaker : Speaker
{
10
public override string SayHi()
{
11
return "你好";
12
}
13
}
14
15
public class FjidjSpeaker : Speaker
{
16
public override string SayHi()
{
17
return "%F&*#";
18
}
19
}
光有这样一些类虽然也可以使用AF模式,但是这样似乎没有什么意义,AF模式经常要制作几个系列的对象,那几个系列的对象还要有逻辑上的关系,否则不但不会起到应有的作用还能使程序变得更加恶心。再定义一组“部件”:
//一系列的“喇叭”,估计这个说吧,最后一个是外星语的2
//它们都从Speaker派生,这是废话3

public class Speaker {4

virtual public string SayHi()
{5
return "Hello";6
}7
}8

9

public class ChineseSpeaker : Speaker
{10

public override string SayHi()
{11
return "你好";12
}13
}14

15

public class FjidjSpeaker : Speaker
{16

public override string SayHi()
{17
return "%F&*#"; 18
}19
} 1
//构造一块屏幕,代码没什么意思
2
public class Screen
{
3
virtual public string Display()
{
4
return "This is Screen";
5
}
6
}
7
8
public class ChineseScreen : Screen
{
9
public override string Display()
{
10
return "这是屏幕";
11
}
12
}
13
14
public class FfdhkScreen : Screen
{
15
public override string Display()
{
16
return "SF&*&*#%";
17
}
18
}
//构造一块屏幕,代码没什么意思2

public class Screen
{3

virtual public string Display()
{4
return "This is Screen";5
}6
}7

8

public class ChineseScreen : Screen
{9

public override string Display()
{10
return "这是屏幕";11
}12
}13

14

public 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;
}
//标准版
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
相关文章