zoukankan      html  css  js  c++  java
  • C#面向对象设计模式纵横谈 笔记6 Prototype 原型(创建型模式)

    依赖关系的倒置

    抽象不应该依赖于实现细节,实现细节应该依赖于抽象。

    1)抽象A直接依赖于实现细节b很容易出现这种情况

    人     ——> 陶瓷水杯

    2)抽象A依赖于抽象B,实现细节b依赖于抽象B将实现细节b抽象出一个抽象B

    ——>   水杯   <——  陶瓷水杯

    动机(Motivation

    在软件系统中,经常面临着某些结构复杂的对象的创建工作;由于需求的变化,这些对象经常面临着剧烈的变化,但是它们却拥有比较稳定一致的接口。

    如何应对这种变化?如何向客户程序(使用这些对象的程序隔离出这些易变对象,从而使得依赖这些易变对象的客户程序不随着需求改变而改变?


    意图(Intent

    使用原型实例指定创建对象的种类,然后通过拷贝这些原型来创建新的对象。       ——  《设计模式》GoF

    结构(Structure

    例说Prototype应用 Codes in .NET

    1)GameSystem.cs

        public class GameSystem
    {
    #region 原型实例
    NormalActor normalActor;
    FlyActor flyActor;
    WaterActor waterActor;
    #endregion

    public GameSystem()
    {
    //... ...
    }

    public void Run()
    {
    //一般的士兵
    NormalActor normalActor1 = normalActor.Clone();
    NormalActor normalActor2
    = normalActor.Clone();
    NormalActor normalActor3
    = normalActor.Clone();
    NormalActor normalActor4
    = normalActor.Clone();
    NormalActor normalActor5
    = normalActor.Clone();

    //会飞的士兵
    FlyActor flyActor1 = flyActor.Clone();
    FlyActor flyActor2
    = flyActor.Clone();

    //会潜水的士兵
    WaterActor waterActor1 = waterActor.Clone();
    WaterActor waterActor2
    = waterActor.Clone();
    }
    }

    2)抽象B

        #region 抽象类
    public abstract class NormalActor
    {
    public abstract NormalActor Clone();
    }

    public abstract class FlyActor
    {
    public abstract FlyActor Clone();
    }

    public abstract class WaterActor
    {
    public abstract WaterActor Clone();
    }
    #endregion

    3)抽象A实现细节类

        public class NormalActorA : NormalActor
    {
    public override NormalActor Clone()
    {
    //缺点是MemberwiseClone只能进行浅复制
    //可以采取序列化和反序列化的方式进行拷贝
    return (NormalActor)this.MemberwiseClone();
    }
    }

    public class NormalActorB : NormalActor
    {
    public override NormalActor Clone()
    {
    return (NormalActor)this.MemberwiseClone();
    }
    }

    public class FlyActorA : FlyActor
    {
    public override FlyActor Clone()
    {
    return (FlyActor)this.MemberwiseClone();
    }
    }

    public class FlyActorB : FlyActor
    {
    public override FlyActor Clone()
    {
    return (FlyActor)this.MemberwiseClone();
    }
    }

    public class WaterActorA : WaterActor
    {
    public override WaterActor Clone()
    {
    return (WaterActor)this.MemberwiseClone();
    }
    }

    public class WaterActorB : WaterActor
    {
    public override WaterActor Clone()
    {
    return (WaterActor)this.MemberwiseClone();
    }
    }


    Prototype模式的几个要点

    1)Prototype模式同样用于隔离类对象的使用者和具体类型(易变类)之间的耦合关系,它同样要求这些易变类拥有稳定的接口

    2)Prototype模式对于如何创建易变类的实体对象采用原型克隆的方法来做,它使得我们可以非常灵活地动态创建拥有某些稳定接口的新对象——所需工作仅仅是注册一个新类的对象(即原型),然后在任何需要的地方不断地Clone

    3)Prototype模式中的Clone方法可以利用.NET中的Object类的MemberwiseClone()方法或者序列化来实现深拷贝。


    有关创建性模式的讨论

    1)Singleton模式解决的是实体对象个数的问题。除了Singleton之外,其他创建型模式解决的都是new所带来的耦合关系

    2)Factory Method, Abstract Factory, Builder都需要一个额外的工厂类来负责实例化易变对象,而Prototype则是通过原型(一个特殊的工厂类)来克隆易变对象

    3)如果遇到易变类,起初的设计通常从Factory Method开始,当遇到更多的复杂变化时,再考虑重构为其他三种工厂模式(Abstract Factory, Builder Prototype)。


    推荐参考书

    1)《设计模式:可复用面向对象软件的基础》GoF 

    2)《面向对象分析与设计》Grady Booch 

    3)《敏捷软件开发:原则、模式与实践》Robert C. Martin

    4)《重构:改善既有代码的设计》Martin Fowler

    5)Refactoring to PatternsJoshua Kerievsky

  • 相关阅读:
    Android 中文 SDK (47) —— Filter
    Android 中文API (65) —— BluetoothClass[蓝牙]
    Android 中文 API——android.widget合集(中)(50篇)(chm格式)
    android 中文 api (72) —— BluetoothSocket[蓝牙]
    Android 中文API (61) —— ViewSwitcher
    Android API 中文 (51) —— ZoomButtonsController
    Android API 中文 (55) —— ListAdapter
    Android SDK 中文 (56) —— ViewFlipper
    什么是 COM编程技术?
    怎么打出全角的小写英文字母?
  • 原文地址:https://www.cnblogs.com/lujiao_cs/p/2147570.html
Copyright © 2011-2022 走看看