﻿<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>IT博客-guquan</title><link>http://www.cnitblog.com/guquan/</link><description /><language>zh-cn</language><lastBuildDate>Sat, 02 May 2026 13:44:35 GMT</lastBuildDate><pubDate>Sat, 02 May 2026 13:44:35 GMT</pubDate><ttl>60</ttl><item><title>设计模式读书笔记之一：创建型模式</title><link>http://www.cnitblog.com/guquan/archive/2006/10/04/17617.html</link><dc:creator>tyler</dc:creator><author>tyler</author><pubDate>Wed, 04 Oct 2006 08:21:00 GMT</pubDate><guid>http://www.cnitblog.com/guquan/archive/2006/10/04/17617.html</guid><wfw:comment>http://www.cnitblog.com/guquan/comments/17617.html</wfw:comment><comments>http://www.cnitblog.com/guquan/archive/2006/10/04/17617.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.cnitblog.com/guquan/comments/commentRss/17617.html</wfw:commentRss><trackback:ping>http://www.cnitblog.com/guquan/services/trackbacks/17617.html</trackback:ping><description><![CDATA[
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; LINE-HEIGHT: 16.5pt; mso-pagination: widow-orphan">
				<span lang="EN-US" style="FONT-SIZE: 12pt; FONT-FAMILY: 宋体; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt">
						<?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" /?>
						<o:p>
						</o:p>
				</span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; LINE-HEIGHT: 16.5pt; mso-pagination: widow-orphan">
				<span lang="EN-US" style="FONT-SIZE: 12pt; FONT-FAMILY: 宋体; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt">
						<o:p>
						</o:p>
				</span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; LINE-HEIGHT: 16.5pt; mso-pagination: widow-orphan">
				<span lang="EN-US" style="FONT-SIZE: 12pt; FONT-FAMILY: 宋体; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt">
						<span style="mso-tab-count: 1">    </span>
				</span>
				<span style="FONT-SIZE: 12pt; FONT-FAMILY: 宋体; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt">设计模式实际上是编写面向对象程序的更好的方法。创建型模式主要关注于创建对象实例的方式，尽管我们可以在主程序中根据需要任意创建我们需要的对象，但是将创建对象的过程抽象成专门的“创造器”类，会使程序更灵活更通用。在我看来，如何生成以及怎样生成对象实例本来属于软件业务范畴的事，不过根据创建对象的经验总结规律并写在一个类里，进而形成范式，对以后解决类似的问题是有好处的。<span lang="EN-US"><o:p></o:p></span></span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; LINE-HEIGHT: 16.5pt; mso-pagination: widow-orphan">
				<span lang="EN-US" style="FONT-SIZE: 12pt; FONT-FAMILY: 宋体; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt">
						<span style="mso-tab-count: 1">    </span>
				</span>
				<span style="FONT-SIZE: 12pt; FONT-FAMILY: 宋体; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt">创建型模式主要有下面几种：<span lang="EN-US"><o:p></o:p></span></span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; LINE-HEIGHT: 16.5pt; mso-pagination: widow-orphan">
				<span style="FONT-SIZE: 12pt; FONT-FAMILY: 宋体; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt">工厂方法模式：<span lang="EN-US"><o:p></o:p></span></span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21pt; LINE-HEIGHT: 16.5pt; mso-pagination: widow-orphan">
				<span style="FONT-SIZE: 12pt; FONT-FAMILY: 宋体; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt">首先看简单工厂模式，这种模式就是建立一个简单的决策类，即这个类能提供一种方法，这个方法能根据输入的参数来决定生成某个抽象基类的哪个子类的实例，有意思的是，这个工厂类本身并不重要，甚至可以没有实例，重要的是它提供的那个方法（可以是静态的），这个函数才是决定生成什么对象的主要场所，实际上简单工厂类只是对这个函数的封装而已。<span lang="EN-US"><o:p></o:p></span></span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21pt; LINE-HEIGHT: 16.5pt; mso-pagination: widow-orphan">
				<span style="FONT-SIZE: 12pt; FONT-FAMILY: 宋体; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt">再看工厂模式，这种模式虽然在名称上和简单工厂模式类似，但含义大不相同，工厂模式并不提供决策点，即工厂类本身不决定生成某个抽象基类的哪个子类实例，而是定义了一个抽象的方法（这个方法能够返回某个抽象基类的子类实例），并将其封装成一个抽象工厂基类，再从这个工厂基类中派生出几个子类，在工厂子类中实现这个抽象的方法来返回一个某个抽象基类的子类实例。在工厂基类中还可以封装生成目标对象所需要的参数变量，在生成工厂子类对象时可以设置这些参数变量，为生成目标对象做好参数准备。通过提供不同的参数变量值来生成不同的工厂子类，这可以通过简单工厂方式实现，在这个简单工厂类中可以实现决策点，只是这个简单工厂返回的还是一个工厂子类，这个工厂子类可以进而生成目标对象。<span lang="EN-US"><o:p></o:p></span></span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; LINE-HEIGHT: 16.5pt; mso-pagination: widow-orphan">
				<span style="FONT-SIZE: 12pt; FONT-FAMILY: 宋体; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt">抽象工厂模式：<span lang="EN-US"><o:p></o:p></span></span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; LINE-HEIGHT: 16.5pt; mso-pagination: widow-orphan">
				<span lang="EN-US" style="FONT-SIZE: 12pt; FONT-FAMILY: 宋体; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt">
						<span style="mso-tab-count: 1">    </span>
				</span>
				<span style="FONT-SIZE: 12pt; FONT-FAMILY: 宋体; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt">这种模式能返回一系列相关类中的某一个，而每个类都能根据需要返回不同对象。这种模式和工厂模式的差别在于它一次创建一组相关类对象，所以，通常的做法是在工厂基类中定义某个目标类的一组对象作为保护成员，然后在工厂子类的构造函数中对这些对象成员初始化，由于在不同工厂子类中对这些对象成员初始化方式不同，所以不同工厂子类能创建一组不同的目标对象<span lang="EN-US"><o:p></o:p></span></span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; LINE-HEIGHT: 16.5pt; mso-pagination: widow-orphan">
				<span style="FONT-SIZE: 12pt; FONT-FAMILY: 宋体; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt">单件模式：<span lang="EN-US"><o:p></o:p></span></span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; LINE-HEIGHT: 16.5pt; mso-pagination: widow-orphan">
				<span lang="EN-US" style="FONT-SIZE: 12pt; FONT-FAMILY: 宋体; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt">
						<span style="mso-tab-count: 1">    </span>
				</span>
				<span style="FONT-SIZE: 12pt; FONT-FAMILY: 宋体; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt">这种模式指某个类只能有一个实例，其做法通常是在类中定义一个静态成员作为标志<span lang="EN-US">FLAG</span>，然后将类的构造函数定义为私有，这样在程序中就不能通过<span lang="EN-US">NEW</span>的方法来创建该类的实例，同时在类中定义一个静态方法来调用类的构造函数创建实例，在这个静态方法中，要首先判断<span lang="EN-US">FLAG</span>来确定是否已经建立了该类的实例，如果没有就调用构造函数创建类的对象实例，然后设置<span lang="EN-US">FLAG</span>表示已经有了该类实例；如果类的实例已经存在，就返回<span lang="EN-US">NULL</span>。<span lang="EN-US"><o:p></o:p></span></span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; LINE-HEIGHT: 16.5pt; mso-pagination: widow-orphan">
				<span lang="EN-US" style="FONT-SIZE: 12pt; FONT-FAMILY: 宋体; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt">
						<span style="mso-tab-count: 1">    </span>
				</span>
				<span style="FONT-SIZE: 12pt; FONT-FAMILY: 宋体; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt">要在程序中访问单件对象实例，必须提供一个全局访问点，通常的做法是在类中定义一个静态的方法来实现？（不太清楚），还可以在程序的开头创建单件实例，作为参数传递到需要使用它的类对象中，或者在程序中创建一个所有单件类的注册表等<span lang="EN-US"><o:p></o:p></span></span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; LINE-HEIGHT: 16.5pt; mso-pagination: widow-orphan">
				<span style="FONT-SIZE: 12pt; FONT-FAMILY: 宋体; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt">生成器模式：<span lang="EN-US"><o:p></o:p></span></span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; LINE-HEIGHT: 16.5pt; mso-pagination: widow-orphan">
				<span lang="EN-US" style="FONT-SIZE: 12pt; FONT-FAMILY: 宋体; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt">
						<span style="mso-tab-count: 1">    </span>
				</span>
				<span style="FONT-SIZE: 12pt; FONT-FAMILY: 宋体; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt">可以将一个复杂对象的构建与它的表示分开，这样可以根据程序的需要创建不同的表示形式。我的理解是生成器模式有点像简单工厂模式，不同的是生成器模式的工厂类根据输入的对象不同来产生相应的处理对象（其中处理对象是对输入对象的操作或处理，比如显示输入对象数据等），此时决策点是在工厂类中，这点是和简单工厂模式相同的。<span lang="EN-US"><o:p></o:p></span></span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; LINE-HEIGHT: 16.5pt; mso-pagination: widow-orphan">
				<span style="FONT-SIZE: 12pt; FONT-FAMILY: 宋体; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt">原型模式：<span lang="EN-US"><o:p></o:p></span></span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; LINE-HEIGHT: 16.5pt; mso-pagination: widow-orphan">
				<span lang="EN-US" style="FONT-SIZE: 12pt; FONT-FAMILY: 宋体; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt">
						<span style="mso-tab-count: 1">    </span>
				</span>
				<span style="FONT-SIZE: 12pt; FONT-FAMILY: 宋体; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt">即先实例化一个类，然后拷贝或克隆该类来创建新的实例，这些实例可以共享同一份数据成员（这就是克隆的含义），这些实例中任何一个对数据的修改都可以被反映到其它实例中。在类的数据量很大而且需要用多种方法处理时，采用这种模式比较好。<span lang="EN-US"><o:p></o:p></span></span>
		</p>
<img src ="http://www.cnitblog.com/guquan/aggbug/17617.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cnitblog.com/guquan/" target="_blank">tyler</a> 2006-10-04 16:21 <a href="http://www.cnitblog.com/guquan/archive/2006/10/04/17617.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>