您好,欢迎访问三七文档
当前位置:首页 > 临时分类 > 设计模式汇总(含示例代码)
设计模式(DesignPattern)设计模式主要分三个类型:创建型、结构型和行为型。创建型:一、单例模式(Singleton):保证一个类只有一个实例,并提供一个访问它的全局访问点二、抽象工厂(AbstractFactory):提供一个创建一系列相关或相互依赖对象的接口,而无须指定它们的具体类。三、工厂方法(FactoryMethod):定义一个用于创建对象的接口,让子类决定实例化哪一个类,FactoryMethod使一个类的实例化延迟到了子类。四、建造模式(Builder):将一个复杂对象的构建与他的表示相分离,使得同样的构建过程可以创建不同的表示。五、原型模式(Prototype):用原型实例指定创建对象的种类,并且通过拷贝这些原型来创建新的对象。行为型:六、迭代器模式(Iterator):提供一个方法顺序访问一个聚合对象的各个元素,而又不需要暴露该对象的内部表示。七、观察者模式(Observer):定义对象间一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都得到通知自动更新。八、模板方法(TemplateMethod):定义一个操作中的算法的骨架,而将一些步骤延迟到子类中,TemplateMethod使得子类可以不改变一个算法的结构即可以重定义该算法得某些特定步骤。九、命令模式(Command):将一个请求封装为一个对象,从而使你可以用不同的请求对客户进行参数化,对请求排队和记录请求日志,以及支持可撤销的操作。十、状态模式(State):允许对象在其内部状态改变时改变他的行为。对象看起来似乎改变了他的类。十一、策略模式(Strategy):定义一系列的算法,把他们一个个封装起来,并使他们可以互相替换,本模式使得算法可以独立于使用它们的客户。十二、职责链模式(ChainofResponsibility):使多个对象都有机会处理请求,从而避免请求的送发者和接收者之间的耦合关系十三、中介者模式(Mediator):用一个中介对象封装一些列的对象交互。十四、访问者模式(Visitor):表示一个作用于某对象结构中的各元素的操作,它使你可以在不改变各元素类的前提下定义作用于这个元素的新操作。十五、解释器模式(Interpreter):给定一个语言,定义他的文法的一个表示,并定义一个解释器,这个解释器使用该表示来解释语言中的句子。十六、备忘录模式(Memento):在不破坏对象的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态。结构型:十七、组合模式(Composite):将对象组合成树形结构以表示部分整体的关系,Composite使得用户对单个对象和组合对象的使用具有一致性。十八、外观模式(Facade):为子系统中的一组接口提供一致的界面,facade提供了一个高层接口,这个接口使得子系统更容易使用。十九、代理模式(Proxy):为其他对象提供一种代理以控制对这个对象的访问二十、适配器模式(Adapter):将一类的接口转换成客户希望的另外一个接口,Adapter模式使得原本由于接口不兼容而不能一起工作那些类可以一起工作。二十一、装饰模式(Decorator):动态地给一个对象增加一些额外的职责,就增加的功能来说,Decorator模式相比生成子类更加灵活。二十二、桥模式(Bridge):将抽象部分与它的实现部分相分离,使他们可以独立的变化。二十三、享元模式(Flyweight)一、单例模式:单例模式确保某一个类只有一个实例,而且自行实例化并向整个系统提供这个实例。这个类称为单例类。单例模式特点:单例类只能有一个实例。单例类必须自己创建自己的唯一实例。单例类必须给所有其他对象提供这一实例。示例代码一:publicclassSingleton{privatestaticSingleton_instance=null;privatestaticobject_lock=newobject();privateSingleton(){}publicstaticSingletonGetInstance(){if(_instance==null){lock(_lock){//线程安全if(instance==null){instance=newSingleton();}}}return_instance;}}先看内层的if语句块,使用这个语句块时,先进行加锁操作,保证只有一个线程可以访问该语句块,进而保证只创建了一个实例。再看外层的if语句块,这使得每个线程欲获取实例时不必每次都得加锁,因为只有实例为空时(即需要创建一个实例),才需加锁创建,若果已存在一个实例,就直接返回该实例,节省了性能开销。示例代码二:publicsealedclassSingleton{privatestaticreadonlySingletoninstance=newSingleton();privateSingleton(){}publicstaticSingletonGetInstance(){returninstance;}}上面使用的readonly关键字可以跟static一起使用,用于指定该常量是类别级的,它的初始化交由静态构造函数实现,并可以在运行时编译。在这种模式下,无需自己解决线程安全性问题,CLR会给我们解决。二、多例模式所谓多例模式,实际上就是单例模式的自然推广,单例类一般情况下只可以有一个实例,但单例类也可以推广到允许有限个实例,这种模式就是多例模式。多例模式有以下特点:多例类可以有多个实例。多例类必须自己创建、管理自己的实例,并向外界提供自己的实例。多例类分为有上限多例类与无上限多例类。示例代码:publicclassMultiton{privatestaticMultitoninstance1=null;privatestaticMultitoninstance2=null;privateMultiton(){}publicstaticMultitonGetInstance(intwhichOne){if(whichOne==1){if(instance1==null){instance1=newMultiton();}returninstance1;}else{if(instance2==null){instance2=newMultiton();}returninstance2;}}}多例类的实例数目不需要有上限,实例数目没有上限的多例模式就叫做无上限多例模式。由于没有上限的多例类对实例的数目是没有限制的,因此,虽然这种多例模式是单例模式的推广,但是这种多例类并不一定能够回到单例类。一般采用聚集管理所有的实例。三、抽象工厂示例代码:publicinterfaceIFruit{}publicclassOrange:IFruit{publicOrange(){Console.WriteLine(Anorangeisgot!);}}publicclassApple:IFruit{publicApple(){Console.WriteLine(Anappleisgot!);}}publicclassFruitFactory{publicIFruitMakeFruit(stringName){IFruitMyFruit=null;try{Typetype=Type.GetType(Name,true);MyFruit=(IFruit)Activator.CreateInstance(type);}catch(TypeLoadExceptione){Console.WriteLine(Idontknowthiskindoffruit,exceptioncaught-{0},e.Message);}returnMyFruit;}}利用反射的好处:增加新的产品的时候,不需要修改客户代码,同时工厂的代码也不需要修改。四、工厂方法工厂方法模式(FactoryMethodPattern)是类的创建模式,其用意是定义一个创建产品对象的工厂接口,将实际创建工作推迟到子类中。工厂模式的角色与结构:抽象工厂(Creator)角色:是工厂方法模式的核心,与应用程序无关。任何在模式中创建的对象的工厂类必须实现这个接口。具体工厂(ConcreteCreator)角色:这是实现抽象工厂接口的具体工厂类,包含与应用程序密切相关的逻辑,并且受到应用程序调用以创建产品对象。在示例中有两个这样的角色:BulbCreator与TubeCreator。抽象产品(Product)角色:工厂方法模式所创建的对象的超类型,也就是产品对象的共同父类或共同拥有的接口。在示例中这个角色是Light。具体产品(ConcreteProduct)角色:这个角色实现了抽象产品角色所定义的接口。某具体产品有专门的具体工厂创建,它们之间往往一一对应。示例代码:publicabstractclassLight{//抽象产品(Product)角色publicabstractvoidTurnOn();publicabstractvoidTurnOff();}publicclassBulbLight:Light{//具体产品(ConcreteProduct)角色publicoverridevoidTurnOn(){Console.WriteLine(BulbLightisTurnedon);}publicoverridevoidTurnOff(){Console.WriteLine(BulbLightisTurnedoff);}}publicclassTubeLight:Light{//具体产品(ConcreteProduct)角色publicoverridevoidTurnOn(){Console.WriteLine(TubeLightisTurnedon);}publicoverridevoidTurnOff(){Console.WriteLine(TubeLightisTurnedoff);}}publicabstractclassCreator{//抽象工厂(Creator)角色publicabstractLightCreate();}publicclassBulbCreator:Creator{//具体工厂(ConcreteCreator)角色publicoverrideLightCreate(){returnnewBulbLight();}}publicclassTubeCreator:Creator{//具体工厂(ConcreteCreator)角色publicoverrideLightCreate(){returnnewTubeLight();}}publicclassClient{publicstaticvoidMain(){Creatorc1=newBulbCreator();Creatorc2=newTubeCreator();Lightl1=c1.Create();Lightl2=c2.Create();l1.TurnOn();l1.TurnOff();l2.TurnOn();l2.TurnOff();}}五、建造模式意图:将一个复杂的构建与其表示相分离,使得同样的构建过程可以创建不同的表示。示例代码:namespaceBuilderExemple{classComputerFactory{/**ComputerFactory是建造者模式的指导者。指导者做的是稳定的建造工作。*假设它就是一个技术人员,他只是在做按照固定的流程,把配件组装成计算机的重复劳动工作。*他不知道他现在组装的是一台游戏电脑还是一台办公用电脑,他也不知道他往主板上安装的内存是1G还是2G的。*/publicvoidBuildComputer(ComputerBuildercb){Console.WriteLine();Console.WriteLine(StartBuilding+cb.Name);cb.SetupMainboard();cb.
本文标题:设计模式汇总(含示例代码)
链接地址:https://www.777doc.com/doc-3664740 .html