|
来源:火龙果软件 作者:俎涛 |
|
2048 次浏览 |
49次 |
|
|
问题 |
存在多组类,
- 从每组内部角度看:多个类之间具有关联性,它们会一起创建和使用。
- 从多组之间角度看:各组类具有类似性。
|
环境 |
每组类具有一致的关联关系。 |
解决方案 |
1.把多组类中的类似性的类进行抽象,建立稳定基点。
例如:American和Chinese抽象成Person,ChineseLanguage和AmericanLanguage抽象成Language。
2.为一组类的创建提供一个统一的抽象工厂类,分别负责组内各个类的创建,而把多个组中的这样的创建类抽象为统一接口。
例如 China负责创建Chinese和ChineseLanguage,America负责创建American和AmericanLanguage,China和American有进一步抽象为Country
3.首先用抽象的工厂类的指针指向具体的工厂类,然后由具体的工厂类创建相关的多个类,为了保持适应性,所有的创建实例都由该类的抽象类代表。
例如:Country指向具体的America,然后America创建American和AmericanLanguage,这些实例由Person和Language指向。通过Person的指针调用America的行为Speak()。 |
效果 |
可以把一组类的创建封装,并通过抽象的指针调用具体类的行为。 |
实例 |
由国家创建人和语言 |
结构类图
模式范例
下面对模式给出范例,包括:
- 需求,采用用例模型描述
- 设计,包括:设计类图,顺序图。
- 实现:代码目录。
- 运行:运行效果界面
用例模型
用例名称 |
什么人说什么话 |
用例概述 |
中国人可以用汉语说话,英国人可以用英语说话。 |
基本场景 |
1. 创建国家,
2. 国家创建人和语言,
3. 人说话 |
设计类图
顺序图:
代码目录
主程序Program.Main()
国家类组 |
abstract
class
Country
{
abstract
public
Person CreatePerson();
abstract
public
Language CreateLanguage();
} |
class
China:Country
{
public
override
Person CreatePerson()
{
Console.WriteLine("正在创建Chinese...");
return
new
Chinese();
}
public
override
Language CreateLanguage()
{
Console.WriteLine("正在创建ChineseLanguage...");
return
new
ChineseLanguage();
}
} |
class
America:Country
{
public
override
Person CreatePerson()
{
Console.WriteLine("正在创建American...");
return
new
American();
}
public
override
Language CreateLanguage()
{
Console.WriteLine("正在创建AmericanLanguage...");
return
new
AmericanLanguage();
}
}
|
语言类组 |
abstract
class
Language
{
abstract
public
string
getWords();
} |
class
AmericanLanguage:Language
{
public
override
string
getWords()
{
return
"Hello";
}
} |
class
ChineseLanguage:Language
{
public
override
string
getWords()
{
return"你好";
}
} |
人种类组 |
abstract
class
Person
{
abstract
public
void
Speak(string
words);
} |
class
Chinese:Person
{
public
override
void
Speak(string
words)
{
Console.WriteLine("Chinese
is speaking words '{0} ' ... ",
words);
}
} |
class
American:Person
{
public
override
void
Speak(string
words)
{
Console.WriteLine("American
is speaking words '{0} ' ... ",words);
}
} |
应用程序 |
class
Program
{
static
void
Main(string[]
args)
{
Console.WriteLine("America建立...");
Country country
= new
America();
//Country
country
= new China();
Person person
=country.CreatePerson();
Language language
= country.CreateLanguage();
string
words = language.getWords();
person.Speak(words);
Console.ReadLine();
}
} |
运行效果
|
|
2048 次浏览 |
49次 |
|
捐助 |
|
|
|