您的位置:首页 > 编程语言 > C#

[置顶]c# 设计模式(1)一 创建型

2011-07-14 17:33 531 查看
为了方便阅读,我把一篇设计模式的资料拆分开发,分为三个大的部分,如下:

Factory

AbstractFactory
Builder
Prototype
Singleton

名称

FactoryMethod

结构



意图

定义一个用于创建对象的接口,让子类决定实例化哪一个类。FactoryMethod使一个类的实例化延迟到其子类。

适用性

当一个类不知道它所必须创建的对象的类的时候。
当一个类希望由它的子类来指定它所创建的对象的时候。
当类将创建对象的职责委托给多个帮助子类中的某一个,并且你希望将哪一个帮助子类是代理者这一信息局部化的时候。
CodeExample

namespaceFactoryMethod_DesignPattern

{

usingSystem;



//Thesetwoclassescouldbepartofaframework,

//whichwewillcallDP

//===============================================



classDPDocument

{





}



abstractclassDPApplication

{

protectedDPDocumentdoc;



abstractpublicvoidCreateDocument();



publicvoidConstructObjects()

{



//Createobjectsasneeded

//...



//includingdocument

CreateDocument();

}

abstractpublicvoidDump();

}



//Thesetwoclassescouldbepartofanapplication

//=================================================



classMyApplication:DPApplication

{

overridepublicvoidCreateDocument()

{

doc=newMyDocument();

}



overridepublicvoidDump()

{

Console.WriteLine("MyApplicationexists");

}

}



classMyDocument:DPDocument

{



}



///<summary>

///SummarydescriptionforClient.

///</summary>

publicclassClient

{

publicstaticintMain(string[]args)

{

MyApplicationmyApplication=newMyApplication();



myApplication.ConstructObjects();



myApplication.Dump();



return0;

}

}

}

名称

AbstractFactory

结构



意图

提供一个创建一系列相关或相互依赖对象的接口,而无需指定它们具体的类。

适用性

一个系统要独立于它的产品的创建、组合和表示时。
一个系统要由多个产品系列中的一个来配置时。
当你要强调一系列相关的产品对象的设计以便进行联合使用时。
当你提供一个产品类库,而只想显示它们的接口而不是实现时。
CodeExample

namespaceAbstractFactory_DesignPattern
{
usingSystem;
//Theseclassescouldbepartofaframework,
//whichwewillcallDP
//===========================================
abstractclassDPDocument
{
abstractpublicvoidDump();
}
abstractclassDPWorkspace
{
abstractpublicvoidDump();
}
abstractclassDPView
{
abstractpublicvoidDump();
}
abstractclassDPFactory
{
abstractpublicDPDocumentCreateDocument();
abstractpublicDPViewCreateView();
abstractpublicDPWorkspaceCreateWorkspace();
}
abstractclassDPApplication
{
protectedDPDocumentdoc;
protectedDPWorkspaceworkspace;
protectedDPViewview;
publicvoidConstructObjects(DPFactoryfactory)
{
//Createobjectsasneeded
doc=factory.CreateDocument();
workspace=factory.CreateWorkspace();
view=factory.CreateView();
}
abstractpublicvoidDump();
publicvoidDumpState()
{
if(doc!=null)doc.Dump();
if(workspace!=null)workspace.Dump();
if(view!=null)view.Dump();
}
}
//Theseclassescouldbepartofanapplication
classMyApplication:DPApplication
{
MyFactorymyFactory=newMyFactory();
overridepublicvoidDump()
{
Console.WriteLine("MyApplicationexists");
}
publicvoidCreateFamily()
{
MyFactorymyFactory=newMyFactory();
ConstructObjects(myFactory);
}
}
classMyDocument:DPDocument
{
publicMyDocument()
{
Console.WriteLine("inMyDocumentconstructor");
}
overridepublicvoidDump()
{
Console.WriteLine("MyDocumentexists");
}
}
classMyWorkspace:DPWorkspace
{
overridepublicvoidDump()
{
Console.WriteLine("MyWorkspaceexists");
}
}
classMyView:DPView
{
overridepublicvoidDump()
{
Console.WriteLine("MyViewexists");
}
}
classMyFactory:DPFactory
{
overridepublicDPDocumentCreateDocument()
{
returnnewMyDocument();
}
overridepublicDPWorkspaceCreateWorkspace()
{
returnnewMyWorkspace();
}
overridepublicDPViewCreateView()
{
returnnewMyView();
}
}
///<summary>
///SummarydescriptionforClient.
///</summary>
publicclassClient
{
publicstaticintMain(string[]args)
{
MyApplicationmyApplication=newMyApplication();
myApplication.CreateFamily();
myApplication.DumpState();
return0;
}
}
}
名称

Builder

结构



意图

将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示。

适用性

当创建复杂对象的算法应该独立于该对象的组成部分以及它们的装配方式时。
当构造过程必须允许被构造的对象有不同的表示时。
CodeExample

namespaceBuilder_DesignPattern
{
usingSystem;
//Thesetwoclassescouldbepartofaframework,
//whichwewillcallDP
//===============================================
classDirector
{
publicvoidConstruct(AbstractBuilderabstractBuilder)
{
abstractBuilder.BuildPartA();
if(1==1)//representssomelocaldecisioninsidedirector
{
abstractBuilder.BuildPartB();
}
abstractBuilder.BuildPartC();
}
}
abstractclassAbstractBuilder
{
abstractpublicvoidBuildPartA();
abstractpublicvoidBuildPartB();
abstractpublicvoidBuildPartC();
}
//Thesetwoclassescouldbepartofanapplication
//=================================================
classConcreteBuilder:AbstractBuilder
{
overridepublicvoidBuildPartA()
{
//CreatesomeobjecthereknowntoConcreteBuilder
Console.WriteLine("ConcreteBuilder.BuildPartAcalled");
}
overridepublicvoidBuildPartB()
{
//CreatesomeobjecthereknowntoConcreteBuilder
Console.WriteLine("ConcreteBuilder.BuildPartBcalled");
}
overridepublicvoidBuildPartC()
{
//CreatesomeobjecthereknowntoConcreteBuilder
Console.WriteLine("ConcreteBuilder.BuildPartCcalled");
}
}
///<summary>
///SummarydescriptionforClient.
///</summary>
publicclassClient
{
publicstaticintMain(string[]args)
{
ConcreteBuilderconcreteBuilder=newConcreteBuilder();
Directordirector=newDirector();
director.Construct(concreteBuilder);
return0;
}
}
}
名称

Prototype

结构



意图

用原型实例指定创建对象的种类,并且通过拷贝这些原型创建新的对象。

适用性

当要实例化的类是在运行时刻指定时,例如,通过动态装载;或者
为了避免创建一个与产品类层次平行的工厂类层次时;或者
当一个类的实例只能有几个不同状态组合中的一种时。建立相应数目的原型并克隆它们可能比每次用合适的状态手工实例化该类更方便一些。
CodeExample

namespacePrototype_DesignPattern

{

usingSystem;

//Objectswhicharetoworkasprototypesmustbebasedonclasseswhich

//arederivedfromtheabstractprototypeclass

abstractclassAbstractPrototype

{

abstractpublicAbstractPrototypeCloneYourself();

}

//Thisisasampleobject

classMyPrototype:AbstractPrototype

{

overridepublicAbstractPrototypeCloneYourself()

{

return((AbstractPrototype)MemberwiseClone());

}

//lotsofotherfunctionsgohere!

}

//Thisistheclientpieceofcodewhichinstantiateobjects

//basedonaprototype.

classDemo

{

privateAbstractPrototypeinternalPrototype;

publicvoidSetPrototype(AbstractPrototypethePrototype)

{

internalPrototype=thePrototype;

}

publicvoidSomeImportantOperation()

{

//DuringSomeimportantoperation,imagineweneed

//toinstantiateanobject-butwedonotknowwhich.Weuse

//thepredefinedprototypeobject,andaskittocloneitself.

AbstractPrototypex;

x=internalPrototype.CloneYourself();

//nowwehavetwoinstancesoftheclasswhichasasaprototype

}

}

///<summary>

///SummarydescriptionforClient.

///</summary>

publicclassClient

{

publicstaticintMain(string[]args)

{

Demodemo=newDemo();

MyPrototypeclientPrototype=newMyPrototype();

demo.SetPrototype(clientPrototype);

demo.SomeImportantOperation();

return0;

}

}

}

名称

Singleton

结构



意图

保证一个类仅有一个实例,并提供一个访问它的全局访问点。

适用性

当类只能有一个实例而且客户可以从一个众所周知的访问点访问它时。
当这个唯一实例应该是通过子类化可扩展的,并且客户应该无需更改代码就能使用一个扩展的实例时。
CodeExample

namespaceSingleton_DesignPattern

{

usingSystem;

classSingleton

{

privatestaticSingleton_instance;

publicstaticSingletonInstance()

{

if(_instance==null)

_instance=newSingleton();

return_instance;

}

protectedSingleton(){}

//Justtoproveonlyasingleinstanceexists

privateintx=0;

publicvoidSetX(intnewVal){x=newVal;}

publicintGetX(){returnx;}

}

///<summary>

///SummarydescriptionforClient.

///</summary>

publicclassClient

{

publicstaticintMain(string[]args)

{

intval;

//can'tcallnew,becauseconstructorisprotected

SingletonFirstSingleton=Singleton.Instance();

SingletonSecondSingleton=Singleton.Instance();

//Nowwehavetwovariables,butbothshouldrefertothesameobject

//Let'sprovethis,bysettingavalueusingonevariable,and

//(hopefully!)retrievingthesamevalueusingthesecondvariable

FirstSingleton.SetX(4);

Console.WriteLine("Usingfirstvariableforsingleton,setxto4");

val=SecondSingleton.GetX();

Console.WriteLine("Usingsecondvariableforsingleton,valueretrieved={0}",val);

return0;

}

}

}

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: