.NET设计模式(7):创建型模式专题总结(Creational Pattern)

简介:

创建型模式专题总结(Creational Pattern

——.NET设计模式系列之七
Terrylee 2006 1
概述
创建型模式,就是用来创建对象的模式,抽象了实例化的过程。它帮助一个系统独立于如何创建、组合和表示它的那些对象。本文对五种常用创建型模式进行了比较,通过一个游戏开发场景的例子来说该如何使用创建型模式。
为什么需要创建型模式
所有的创建型模式都有两个永恒的主旋律:第一,它们都将系统使用哪些具体类的信息封装起来;第二,它们隐藏了这些类的实例是如何被创建和组织的。外界对于这些对象只知道它们共同的接口,而不清楚其具体的实现细节。正因如此,创建型模式在创建什么( what ),由谁( who )来创建,以及何时( when )创建这些方面,都为软件设计者提供了尽可能大的灵活性。
假定在一个游戏开发场景中,会用到一个现代风格房屋的对象,按照我们的一般想法,既然需要对象就创建一个:
ModernRoom room = new ModernRoom();
好了,现在现代风格房屋的对象已经有了,如果这时房屋的风格变化了,需要的是古典风格的房屋,修改一下:
Classical Room room = new  Classical Room();
试想一下,在我们的程序中有多少处地方用到了这样的创建逻辑,而这里仅仅是房屋的风格变化了,就需要修改程序中所有的这样的语句。现在我们封装对象创建的逻辑,把对象的创建放在一个工厂方法中:
ModernFactory factory = new ModernFactory();
ModernRoom room = factory.Create();
当房屋的风格变化时,只需要修改
Classical Factory factory = new  Classical Factory();
Classical Room 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 instance=new 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()
    {
        = 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 "  );
        foreachstring 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 WebCast:[url]http://www.microsoft.com/china/msdn/events/webcasts/shared/Webcast/MSDNWebCast.aspx[/url]












本文转自lihuijun51CTO博客,原文链接:  http://blog.51cto.com/terrylee/67754 ,如需转载请自行联系原作者

相关文章
|
9月前
|
设计模式 Java 数据库连接
【设计模式】【创建型模式】工厂方法模式(Factory Methods)
一、入门 什么是工厂方法模式? 工厂方法模式(Factory Method Pattern)是一种创建型设计模式,它定义了一个用于创建对象的接口,但由子类决定实例化哪个类。工厂方法模式使类的实例化延迟
288 16
|
9月前
|
设计模式 缓存 安全
【设计模式】【创建型模式】单例模式(Singleton)
一、入门 什么是单例模式? 单例模式是一种设计模式,确保一个类只有一个实例,并提供一个全局访问点。它常用于需要全局唯一对象的场景,如配置管理、连接池等。 为什么要单例模式? 节省资源 场景:某些对象创
354 15
|
9月前
|
设计模式 JavaScript Java
【设计模式】【创建型模式】原型模式(Prototype)
一、入门 什么是原型模式? 原型模式(Prototype Pattern)是一种创建型设计模式,它通过复制现有对象来创建新对象,而不是通过实例化类。 原型模式的核心是克隆(Clone),即通过复制现有
264 15
|
9月前
|
设计模式 Java Apache
【设计模式】【创建型模式】建造者模式(Builder)
一、入门 什么是建造者模式? 建造者模式(Builder Pattern)是一种创建型设计模式,用于逐步构建复杂对象。 它通过将对象的构建过程与表示分离,使得相同的构建过程可以创建不同的表示。 为什么
506 14
|
9月前
|
设计模式 Java 关系型数据库
【设计模式】【创建型模式】抽象工厂模式(Abstract Factory)
一、入门 什么是抽象工厂模式? 抽象工厂模式是一种创建型设计模式,它提供了一个接口,用于创建相关或依赖对象的家族,而不需要指定具体的类。 简单来说,抽象工厂模式是工厂方法模式的升级版,它能够创建一组相
334 14
|
11月前
|
设计模式 Java 数据安全/隐私保护
Java 设计模式:装饰者模式(Decorator Pattern)
装饰者模式属于结构型设计模式,允许通过动态包装对象的方式为对象添加新功能,提供比继承更灵活的扩展方式。该模式通过组合替代继承,遵循开闭原则(对扩展开放,对修改关闭)。
|
11月前
|
设计模式 XML Java
设计模式觉醒系列(03)创建型模式的5个设计模式 | 一口气讲全讲透
本文详细介绍了设计模式中的创建型模式,包括建造者模式、原型模式、单例模式、工厂方法模式和抽象工厂模式。创建型模式关注对象的创建过程,隐藏了创建细节,以提高代码的可维护性和可扩展性。通过具体的实战demo和应用场景分析,展示了每种模式的特点和优势。例如,建造者模式适用于复杂对象的分步骤构建;原型模式通过复制对象实现高效复用;单例模式确保全局唯一实例;工厂方法模式和抽象工厂模式则提供了灵活的对象创建机制,支持多类型产品族的生产。这些模式在实际开发中能够简化客户端代码,提升系统灵活性和复用性。
|
设计模式 架构师 Java
设计模式之 5 大创建型模式,万字长文深剖 ,近 30 张图解!
设计模式是写出优秀程序的保障,是让面向对象保持结构良好的秘诀,与架构能力与阅读源码的能力息息相关,本文深剖设计模式之 5 大创建型模式。关注【mikechen的互联网架构】,10年+BAT架构经验倾囊相授。
设计模式之 5 大创建型模式,万字长文深剖 ,近 30 张图解!
|
设计模式 存储 安全
【23种设计模式·全精解析 | 创建型模式篇】5种创建型模式的结构概述、实现、优缺点、扩展、使用场景、源码解析
创建型模式的主要关注点是“怎样创建对象?”,它的主要特点是"将对象的创建与使用分离”。这样可以降低系统的耦合度,使用者不需要关注对象的创建细节。创建型模式分为5种:单例模式、工厂方法模式抽象工厂式、原型模式、建造者模式。
1079 2
【23种设计模式·全精解析 | 创建型模式篇】5种创建型模式的结构概述、实现、优缺点、扩展、使用场景、源码解析
|
设计模式 存储 安全
【23种设计模式·全精解析 | 创建型模式篇】5种创建型模式的结构概述、实现、优缺点、扩展、使用场景、源码解析
结构型模式描述如何将类或对象按某种布局组成更大的结构。它分为类结构型模式和对象结构型模式,前者采用继承机制来组织接口和类,后者釆用组合或聚合来组合对象。由于组合关系或聚合关系比继承关系耦合度低,满足“合成复用原则”,所以对象结构型模式比类结构型模式具有更大的灵活性。 结构型模式分为以下 7 种: • 代理模式 • 适配器模式 • 装饰者模式 • 桥接模式 • 外观模式 • 组合模式 • 享元模式
【23种设计模式·全精解析 | 创建型模式篇】5种创建型模式的结构概述、实现、优缺点、扩展、使用场景、源码解析

热门文章

最新文章