湖北企业网站建设,扬州市城乡建设局招标网站,长沙做网站a微联讯点很好,类似视频教程网站的wordpress主题概述 创建型模式#xff0c;就是用来创建对象的模式#xff0c;抽象了实例化的过程。它帮助一个系统独立于如何创建、组合和表示它的那些对象。本文对五种常用创建型模式进行了比较#xff0c;通过一个游戏开发场景的例子来说该如何使用创建型模式。 为什么需要创建型模式 所…概述 创建型模式就是用来创建对象的模式抽象了实例化的过程。它帮助一个系统独立于如何创建、组合和表示它的那些对象。本文对五种常用创建型模式进行了比较通过一个游戏开发场景的例子来说该如何使用创建型模式。 为什么需要创建型模式 所有的创建型模式都有两个永恒的主旋律第一它们都将系统使用哪些具体类的信息封装起来第二它们隐藏了这些类的实例是如何被创建和组织的。外界对于这些对象只知道它们共同的接口而不清楚其具体的实现细节。正因如此创建型模式在创建什么what由谁who来创建以及何时when创建这些方面都为软件设计者提供了尽可能大的灵活性。 假定在一个游戏开发场景中会用到一个现代风格房屋的对象按照我们的一般想法既然需要对象就创建一个 ModernRoom room new ModernRoom(); 好了现在现代风格房屋的对象已经有了如果这时房屋的风格变化了需要的是古典风格的房屋修改一下 ClassicalRoom room new ClassicalRoom(); 试想一下在我们的程序中有多少处地方用到了这样的创建逻辑而这里仅仅是房屋的风格变化了就需要修改程序中所有的这样的语句。现在我们封装对象创建的逻辑把对象的创建放在一个工厂方法中 ModernFactory factory new ModernFactory(); ModernRoom room factory.Create(); 当房屋的风格变化时只需要修改 ClassicalFactory factory new ClassicalFactory(); ClassicalRoom room factory.Create(); 而其它的用到room的地方仍然不变。这就是为什么需要创建型模式了。创建者模式作用可以概括为如下两点 1封装创建逻辑绝不仅仅是new一个对象那么简单。 2封装创建逻辑变化客户代码尽量不修改或尽量少修改。 常见的五种创建型模式 单件模式Singleton Pattern解决的是实体对象的个数问题其他的都是解决new所带来的耦合关系问题。 工厂方法模式Factory Pattern在工厂方法中工厂类成为了抽象类其实际的创建工作将由其具体子类来完成。工厂方法的用意是定义一个创建产品对象的工厂接口将实际创建工作推迟到子类中去强调的是“单个对象”的变化。 抽象工厂模式Abstract Factory抽象工厂是所有工厂模式中最为抽象和最具有一般性的一种形态。抽象工厂可以向客户提供一个接口使得客户可以在不必指定产品的具体类型的情况下创建多个产品族中的产品对象强调的是“系列对象”的变化。 生成器模式Builder Pattern把构造对象实例的逻辑移到了类的外部在这个类的外部定义了这个类的构造逻辑。他把一个复杂对象的构造过程从对象的表示中分离出来。其直接效果是将一个复杂的对象简化为一个比较简单的目标对象。他强调的是产品的构造过程。 原型模式Prototype Pattern和工厂模式一样同样对客户隐藏了对象创建工作但是与通过对一个类进行实例化来构造新对象不同的是原型模式是通过拷贝一个现有对象生成新对象的。 如何选择使用创建型模式 继续考虑上面提到的游戏开发场景假定在这个游戏场景中我们使用到的有墙Wall屋子Room门Door几个部件。在这个过程中同样是对象的创建问题但是会根据所要解决的问题不同而使用不同的创建型模式。 如果在游戏中一个屋子只允许有一个门存在那么这就是一个使用Signleton模式的例子确保只有一个Door类的实例被创建。解决的是对象创建个数的问题。 示例代码 using System; public sealed class SigletonDoor { static readonly SigletonDoor instancenew SigletonDoor(); static SigletonDoor() { } public static SigletonDoor Instance { get { return instance; } } } 在游戏中需要创建墙屋子的实例时为了避免直接对构造器的调用而实例化类这时就是工厂方法模式了每一个部件都有它自己的工厂类。解决的是“单个对象”的需求变化问题。 示例代码 using System; public abstract class Wall { public abstract void Display(); } public class ModernWall:Wall { public override void Display() { Console.WriteLine(ModernWall Builded); } } public abstract class WallFactory { public abstract Wall Create(); } public class ModernFactory:WallFactory { public override Wall Create() { return new ModernWall();; } } 在游戏场景中不可能只有一种墙或屋子有可能有现代风格Modern古典风格Classical等多系列风格的部件。这时就是一系列对象的创建问题了是一个抽象工厂的例子。解决的是“系列对象”的需求变化问题。 示例代码 using System; public abstract class Wall { public abstract void Display(); } public class ModernWall:Wall { public override void Display() { Console.WriteLine(ModernWall Builded); } } public class ClassicalWall:Wall { public override void Display() { Console.WriteLine(ClassicalWall Builded); } } public abstract class Room { public abstract void Display(); } public class ModernRoom:Room { public override void Display() { Console.WriteLine(ModernRoom Builded); } } public class ClassicalRoom:Room { public override void Display() { Console.WriteLine(ClassicalRoom Builded); } } public abstract class AbstractFactory { public abstract Wall CreateWall(); public abstract Room CreateRoom(); } public class ModernFactory:AbstractFactory { public override Wall CreateWall() { return new ModernWall(); } public override Room CreateRoom() { return new ModernRoom(); } } public class ClassicalFactory:AbstractFactory { public override Wall CreateWall() { return new ClassicalWall(); } public override Room CreateRoom() { return new ClassicalRoom(); } } 如果在游戏场景中构成某一个场景的算法比较稳定例如这个场景就是用四堵墙一个屋子一扇门来构成的但具体是用什么风格的墙、屋子和门则是不停的变化的这就是一个生成器模式的例子。解决的是“对象部分”的需求变化问题。 示例代码 using System; using System.Collections; public class Director { public void Construct( Builder builder ) { builder.BuildWall(); builder.BuildRoom(); builder.BuildDoor(); } } public abstract class Builder { public abstract void BuildWall(); public abstract void BuildRoom(); public abstract void BuildDoor(); public abstract GameScene GetResult(); } public class GameBuilder : Builder { private GameScene g; public override void BuildWall() { g new GameScene(); g.Add( Wall ); } public override void BuildRoom() { g.Add( Room ); } public override void BuildDoor() { g.Add( Door ); } public override GameScene GetResult() { return g; } } public class GameScene { ArrayList parts new ArrayList(); public void Add( string part ) { parts.Add( part ); } public void Display() { Console.WriteLine( GameScene Parts ); foreach( string part in parts ) Console.WriteLine( part ); } } 如果在游戏中需要大量的古典风格或现代风格的墙或屋子这时可以通过拷贝一个已有的原型对象来生成新对象就是一个原型模式的例子了。通过克隆来解决“易变对象”的创建问题。 示例代码 using System; public abstract class RoomPrototype { public abstract RoomPrototype Clone(); } public class ModernPrototype:RoomPrototype { public override RoomPrototype Clone() { return (RoomPrototype)this.MemberwiseClone(); } } public class ClassicalPrototype:RoomPrototype { public override RoomPrototype Clone() { return (RoomPrototype)this.MemberwiseClone(); } } 究竟选用哪一种模式最好取决于很多的因素。使用Abstract Factory、Prototype Pattern或Builder Pattern的设计比使用Factory Method的设计更加灵活但是也更加复杂尤其Abstract Factory需要庞大的工厂类来支持。通常设计以使用Factory Method开始并且当设计者发现需要更大的灵活性时设计便会向其他设计模式演化当你在多个设计模式之间进行权衡的时候了解多个设计模式可以给你提供更多的选择余地。 总结 使用创建者模式是为了提高系统的可维护性和可扩展性提高应对需求变化的能力 参考文献 《设计模式中文版》 《DesignPatternsExplained》 idior 的《你了解创建者模式了吗? --- 创建者模式详解 》 MSDN WebCasthttp://www.microsoft.com/china/msdn/events/webcasts/shared/Webcast/MSDNWebCast.aspx 转载于:https://www.cnblogs.com/Aioria0622/archive/2007/11/21/967895.html