<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Wut I am &#187; 设计模式</title>
	<atom:link href="http://wutiam.net/tag/design-pattern/feed/" rel="self" type="application/rss+xml" />
	<link>http://wutiam.net</link>
	<description>I'm islet8, I'm what I am</description>
	<lastBuildDate>Wed, 28 Jul 2010 02:50:02 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=2.9.2</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<item>
		<title>应用工厂模式解决实际问题</title>
		<link>http://wutiam.net/2009/03/use-factory-pattern-to-solve-problem/</link>
		<comments>http://wutiam.net/2009/03/use-factory-pattern-to-solve-problem/#comments</comments>
		<pubDate>Tue, 10 Mar 2009 14:33:04 +0000</pubDate>
		<dc:creator>islet8</dc:creator>
				<category><![CDATA[Development]]></category>
		<category><![CDATA[编程]]></category>
		<category><![CDATA[设计模式]]></category>

		<guid isPermaLink="false">http://wutiam.net/?p=84</guid>
		<description><![CDATA[我前段时间去面试时的一道题目，问题如下：
有一个脚本文件，每行有一句指令或空行，指令格式：

Command[,Param[,Value]]

其中Parameter 和 Value 非必须。设计一套解析指令的类，高效且易于扩展（尽可能降低代码内部耦合性）。
当时虽然都想到了，不过满脑混沌，没有完整明白地表达出来。本来想去公司再看看代码是怎么实现的，昨天在网上闲逛的时候忽然看到了这篇笔记，那就顺便也整理了下自己的思路，结合实际温故理论。
假设有“移动（Move）”、“攻击（Attack）”等几个指令；建立一个工厂类，并将所有指令类预先注册到工厂中，由工厂调用每个指令类的静态成员函数 CreateInstance() 来实现指令类实例的创建：


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
class Command
&#123;
public:
    virtual ~Command&#40;void&#41; &#123;&#125;
&#160;
    virtual void Excute&#40;void&#41; = 0;
&#160;
protected:
    Command&#40;const std::string&#38; strParam, const std::string&#38; strValue&#41;
        : m_strParam&#40;strParam&#41;
        , m_strValue&#40;strValue&#41;
    &#123;
    [...]


No related posts.]]></description>
			<content:encoded><![CDATA[<p>我前段时间去面试时的一道题目，问题如下：</p>
<blockquote><p>有一个脚本文件，每行有一句指令或空行，指令格式：</p>

<div class="wp_syntax"><div class="code"><pre class="txt" style="font-family:monospace;">Command[,Param[,Value]]</pre></div></div>

<p>其中Parameter 和 Value 非必须。设计一套解析指令的类，高效且易于扩展（尽可能降低代码内部耦合性）。</p></blockquote>
<p>当时虽然都想到了，不过满脑混沌，没有完整明白地表达出来。本来想去公司再看看代码是怎么实现的，昨天在网上闲逛的时候忽然看到了这篇笔记，那就顺便也整理了下自己的思路，结合实际温故理论。</p>
<p>假设有“移动（Move）”、“攻击（Attack）”等几个指令；建立一个工厂类，并将所有指令类预先注册到工厂中，由工厂调用每个指令类的静态成员函数 CreateInstance() 来实现指令类实例的创建：</p>
<p><span id="more-84"></span></p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
</pre></td><td class="code"><pre class="cpp" style="font-family:monospace;"><span style="color: #0000ff;">class</span> Command
<span style="color: #008000;">&#123;</span>
<span style="color: #0000ff;">public</span><span style="color: #008080;">:</span>
    <span style="color: #0000ff;">virtual</span> ~Command<span style="color: #008000;">&#40;</span><span style="color: #0000ff;">void</span><span style="color: #008000;">&#41;</span> <span style="color: #008000;">&#123;</span><span style="color: #008000;">&#125;</span>
&nbsp;
    <span style="color: #0000ff;">virtual</span> <span style="color: #0000ff;">void</span> Excute<span style="color: #008000;">&#40;</span><span style="color: #0000ff;">void</span><span style="color: #008000;">&#41;</span> <span style="color: #000080;">=</span> <span style="color: #0000dd;">0</span><span style="color: #008080;">;</span>
&nbsp;
<span style="color: #0000ff;">protected</span><span style="color: #008080;">:</span>
    Command<span style="color: #008000;">&#40;</span><span style="color: #0000ff;">const</span> std<span style="color: #008080;">::</span><span style="color: #007788;">string</span><span style="color: #000040;">&amp;</span> strParam, <span style="color: #0000ff;">const</span> std<span style="color: #008080;">::</span><span style="color: #007788;">string</span><span style="color: #000040;">&amp;</span> strValue<span style="color: #008000;">&#41;</span>
        <span style="color: #008080;">:</span> m_strParam<span style="color: #008000;">&#40;</span>strParam<span style="color: #008000;">&#41;</span>
        , m_strValue<span style="color: #008000;">&#40;</span>strValue<span style="color: #008000;">&#41;</span>
    <span style="color: #008000;">&#123;</span>
    <span style="color: #008000;">&#125;</span>
&nbsp;
<span style="color: #0000ff;">private</span><span style="color: #008080;">:</span>
    <span style="color: #666666;">// this constructor is prohibited</span>
    Command<span style="color: #008000;">&#40;</span><span style="color: #0000ff;">void</span><span style="color: #008000;">&#41;</span> <span style="color: #008000;">&#123;</span><span style="color: #008000;">&#125;</span>
&nbsp;
<span style="color: #0000ff;">private</span><span style="color: #008080;">:</span>
    std<span style="color: #008080;">::</span><span style="color: #007788;">string</span> m_strParam<span style="color: #008080;">;</span>
    std<span style="color: #008080;">::</span><span style="color: #007788;">string</span> m_strValue<span style="color: #008080;">;</span>
<span style="color: #008000;">&#125;</span><span style="color: #008080;">;</span>
&nbsp;
<span style="color: #0000ff;">class</span> CmdMove <span style="color: #008080;">:</span> <span style="color: #0000ff;">public</span> Command
<span style="color: #008000;">&#123;</span>
<span style="color: #0000ff;">public</span><span style="color: #008080;">:</span>
    <span style="color: #666666;">// static member function used by factory</span>
    <span style="color: #0000ff;">static</span> Command<span style="color: #000040;">*</span> CreateInstance<span style="color: #008000;">&#40;</span><span style="color: #0000ff;">const</span> std<span style="color: #008080;">::</span><span style="color: #007788;">string</span><span style="color: #000040;">&amp;</span> strParam, <span style="color: #0000ff;">const</span> std<span style="color: #008080;">::</span><span style="color: #007788;">string</span><span style="color: #000040;">&amp;</span> strValue<span style="color: #008000;">&#41;</span>
    <span style="color: #008000;">&#123;</span>
        <span style="color: #0000ff;">return</span> <span style="color: #008000;">&#40;</span>Command<span style="color: #000040;">*</span><span style="color: #008000;">&#41;</span><span style="color: #0000dd;">new</span> CmdMove<span style="color: #008000;">&#40;</span>strParam, strValue<span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
    <span style="color: #008000;">&#125;</span>
&nbsp;
    <span style="color: #0000ff;">virtual</span> ~CmdMove<span style="color: #008000;">&#40;</span><span style="color: #0000ff;">void</span><span style="color: #008000;">&#41;</span> <span style="color: #008000;">&#123;</span><span style="color: #008000;">&#125;</span>
&nbsp;
    <span style="color: #0000ff;">virtual</span> <span style="color: #0000ff;">void</span> Excute<span style="color: #008000;">&#40;</span><span style="color: #0000ff;">void</span><span style="color: #008000;">&#41;</span>
    <span style="color: #008000;">&#123;</span>
        <span style="color: #666666;">// TODO</span>
    <span style="color: #008000;">&#125;</span>
&nbsp;
<span style="color: #0000ff;">protected</span><span style="color: #008080;">:</span>
    CmdMove<span style="color: #008000;">&#40;</span><span style="color: #0000ff;">const</span> std<span style="color: #008080;">::</span><span style="color: #007788;">string</span><span style="color: #000040;">&amp;</span> strParam, <span style="color: #0000ff;">const</span> std<span style="color: #008080;">::</span><span style="color: #007788;">string</span><span style="color: #000040;">&amp;</span> strValue<span style="color: #008000;">&#41;</span>
        <span style="color: #008080;">:</span> Command<span style="color: #008000;">&#40;</span>strParam, strValue<span style="color: #008000;">&#41;</span>
    <span style="color: #008000;">&#123;</span>
        <span style="color: #666666;">// TODO</span>
    <span style="color: #008000;">&#125;</span>
&nbsp;
<span style="color: #0000ff;">private</span><span style="color: #008080;">:</span>
    CmdMove<span style="color: #008000;">&#40;</span><span style="color: #0000ff;">void</span><span style="color: #008000;">&#41;</span> <span style="color: #008000;">&#123;</span><span style="color: #008000;">&#125;</span>
<span style="color: #008000;">&#125;</span><span style="color: #008080;">;</span>
&nbsp;
<span style="color: #0000ff;">class</span> CmdAttack <span style="color: #008080;">:</span> <span style="color: #0000ff;">public</span> Command
<span style="color: #008000;">&#123;</span>
<span style="color: #0000ff;">public</span><span style="color: #008080;">:</span>
    <span style="color: #0000ff;">static</span> Command<span style="color: #000040;">*</span> CreateInstance<span style="color: #008000;">&#40;</span><span style="color: #0000ff;">const</span> std<span style="color: #008080;">::</span><span style="color: #007788;">string</span><span style="color: #000040;">&amp;</span> strParam, <span style="color: #0000ff;">const</span> std<span style="color: #008080;">::</span><span style="color: #007788;">string</span><span style="color: #000040;">&amp;</span> strValue<span style="color: #008000;">&#41;</span>
    <span style="color: #008000;">&#123;</span>
        <span style="color: #0000ff;">return</span> <span style="color: #008000;">&#40;</span>Command<span style="color: #000040;">*</span><span style="color: #008000;">&#41;</span><span style="color: #0000dd;">new</span> CmdAttack<span style="color: #008000;">&#40;</span>strParam, strValue<span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
    <span style="color: #008000;">&#125;</span>
&nbsp;
    <span style="color: #0000ff;">virtual</span> ~CmdAttack<span style="color: #008000;">&#40;</span><span style="color: #0000ff;">void</span><span style="color: #008000;">&#41;</span> <span style="color: #008000;">&#123;</span><span style="color: #008000;">&#125;</span>
&nbsp;
    <span style="color: #0000ff;">virtual</span> <span style="color: #0000ff;">void</span> Excute<span style="color: #008000;">&#40;</span><span style="color: #0000ff;">void</span><span style="color: #008000;">&#41;</span>
    <span style="color: #008000;">&#123;</span>
        <span style="color: #666666;">// TODO</span>
    <span style="color: #008000;">&#125;</span>
&nbsp;
<span style="color: #0000ff;">protected</span><span style="color: #008080;">:</span>
    CmdAttack<span style="color: #008000;">&#40;</span><span style="color: #0000ff;">const</span> std<span style="color: #008080;">::</span><span style="color: #007788;">string</span><span style="color: #000040;">&amp;</span> strParam, <span style="color: #0000ff;">const</span> std<span style="color: #008080;">::</span><span style="color: #007788;">string</span><span style="color: #000040;">&amp;</span> strValue<span style="color: #008000;">&#41;</span>
        <span style="color: #008080;">:</span> Command<span style="color: #008000;">&#40;</span>strParam, strValue<span style="color: #008000;">&#41;</span>
    <span style="color: #008000;">&#123;</span>
        <span style="color: #666666;">// TODO</span>
    <span style="color: #008000;">&#125;</span>
&nbsp;
<span style="color: #0000ff;">private</span><span style="color: #008080;">:</span>
    CmdAttack<span style="color: #008000;">&#40;</span><span style="color: #0000ff;">void</span><span style="color: #008000;">&#41;</span> <span style="color: #008000;">&#123;</span><span style="color: #008000;">&#125;</span>
<span style="color: #008000;">&#125;</span><span style="color: #008080;">;</span></pre></td></tr></table></div>


<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
</pre></td><td class="code"><pre class="cpp" style="font-family:monospace;"><span style="color: #666666;">// the format of the function used by factory</span>
<span style="color: #0000ff;">typedef</span> Command<span style="color: #000040;">*</span> <span style="color: #008000;">&#40;</span><span style="color: #000040;">*</span>CreateCmdInstanceFunc<span style="color: #008000;">&#41;</span><span style="color: #008000;">&#40;</span><span style="color: #0000ff;">const</span> std<span style="color: #008080;">::</span><span style="color: #007788;">string</span><span style="color: #000040;">&amp;</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
&nbsp;
<span style="color: #0000ff;">class</span> CommandFactory
<span style="color: #008000;">&#123;</span>
<span style="color: #0000ff;">public</span><span style="color: #008080;">:</span>
    <span style="color: #0000ff;">static</span> CommandFactory<span style="color: #000040;">*</span> GetInstance<span style="color: #008000;">&#40;</span><span style="color: #0000ff;">void</span><span style="color: #008000;">&#41;</span>
    <span style="color: #008000;">&#123;</span>
        <span style="color: #0000ff;">static</span> CommandFactory cfInstance<span style="color: #008080;">;</span>
&nbsp;
        <span style="color: #0000ff;">return</span> <span style="color: #000040;">&amp;</span>cfInstance<span style="color: #008080;">;</span>
    <span style="color: #008000;">&#125;</span>
&nbsp;
    <span style="color: #0000ff;">virtual</span> ~CommandFactory<span style="color: #008000;">&#40;</span><span style="color: #0000ff;">void</span><span style="color: #008000;">&#41;</span> <span style="color: #008000;">&#123;</span><span style="color: #008000;">&#125;</span>
&nbsp;
    <span style="color: #0000ff;">void</span> RegCommand<span style="color: #008000;">&#40;</span>std<span style="color: #008080;">::</span><span style="color: #007788;">string</span><span style="color: #000040;">&amp;</span> strCmdName, CreateCmdInstanceFunc func<span style="color: #008000;">&#41;</span>
    <span style="color: #008000;">&#123;</span>
        m_mapCommands<span style="color: #008000;">&#91;</span>strCmdName<span style="color: #008000;">&#93;</span> <span style="color: #000080;">=</span> func<span style="color: #008080;">;</span>
    <span style="color: #008000;">&#125;</span>
&nbsp;
    <span style="color: #0000ff;">void</span> ExcuteCommand<span style="color: #008000;">&#40;</span><span style="color: #0000ff;">const</span> std<span style="color: #008080;">::</span><span style="color: #007788;">string</span><span style="color: #000040;">&amp;</span> strCmdName, <span style="color: #0000ff;">const</span> std<span style="color: #008080;">::</span><span style="color: #007788;">string</span><span style="color: #000040;">&amp;</span> strParam, <span style="color: #0000ff;">const</span> std<span style="color: #008080;">::</span><span style="color: #007788;">string</span><span style="color: #000040;">&amp;</span> strValue<span style="color: #008000;">&#41;</span>
    <span style="color: #008000;">&#123;</span>
        Command<span style="color: #000040;">*</span> pCmd <span style="color: #000080;">=</span> m_mapCommands<span style="color: #008000;">&#91;</span>strCmdName<span style="color: #008000;">&#93;</span><span style="color: #008000;">&#40;</span>strParam, strValue<span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
&nbsp;
        pCmd<span style="color: #000040;">-</span><span style="color: #000080;">&gt;</span>Excute<span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
&nbsp;
        <span style="color: #0000dd;">delete</span> pCmd<span style="color: #008080;">;</span> pCmd <span style="color: #000080;">=</span> <span style="color: #0000ff;">NULL</span><span style="color: #008080;">;</span>
    <span style="color: #008000;">&#125;</span>
&nbsp;
<span style="color: #0000ff;">private</span><span style="color: #008080;">:</span>
    CommandFactory<span style="color: #008000;">&#40;</span><span style="color: #0000ff;">void</span><span style="color: #008000;">&#41;</span> <span style="color: #008000;">&#123;</span><span style="color: #008000;">&#125;</span>
&nbsp;
<span style="color: #0000ff;">private</span><span style="color: #008080;">:</span>
    std<span style="color: #008080;">::</span><span style="color: #007788;">map</span> m_mapCommands<span style="color: #008080;">;</span>
<span style="color: #008000;">&#125;</span><span style="color: #008080;">;</span></pre></td></tr></table></div>

<p>由于工厂类同时使用了单例模式（Singleton），在应用程序的预处理阶段通过调用：</p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
</pre></td><td class="code"><pre class="cpp" style="font-family:monospace;">CommandFactory<span style="color: #008080;">::</span><span style="color: #007788;">GetInstance</span><span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span><span style="color: #000040;">-</span><span style="color: #000080;">&gt;</span>RegCommand<span style="color: #008000;">&#40;</span>std<span style="color: #008080;">::</span><span style="color: #007788;">string</span><span style="color: #008000;">&#40;</span><span style="color: #FF0000;">&quot;MOVE&quot;</span><span style="color: #008000;">&#41;</span>, CmdMove<span style="color: #008080;">::</span><span style="color: #007788;">CreateInstance</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span></pre></td></tr></table></div>

<p>便可完成指令的注册。在脚本文件解析阶段通过调用：</p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
</pre></td><td class="code"><pre class="cpp" style="font-family:monospace;">CommandFactory<span style="color: #008080;">::</span><span style="color: #007788;">GetInstance</span><span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span><span style="color: #000040;">-</span><span style="color: #000080;">&gt;</span>ExcuteCommand<span style="color: #008000;">&#40;</span>strCmdName, strParam, strValue<span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span></pre></td></tr></table></div>

<p>便可完成对应指令的操作。</p>
<p>以上代码不包含容错处理，不足在于所有 Command 的子类都需要约定定义一个静态类成员函数（CreateInstance()）用于该指令实例的创建，不知是否还有更完美的解决方案？</p>


<p>No related posts.</p>]]></content:encoded>
			<wfw:commentRss>http://wutiam.net/2009/03/use-factory-pattern-to-solve-problem/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
	</channel>
</rss>
