zoukankan      html  css  js  c++  java
  • 如何编写优雅的代码:05. 设计模式(下)

    截至上一篇文章,已经介绍了8个常用的设计模式。四人帮(Gang of Four)总结的第一版设计模式中,一共有23个模式,后来又陆续总结了些,应该有三十多个。个人实际工作中常用到11个设计模式(前文介绍的8个以及本文将介绍的3个),我认为这也是最常用的模式。本文将再介绍3个常用的设计模式:Singleton(单体)模式、Factory Method(工厂方法)模式和Prototype(原型)模式。在下一篇将介绍部分设计模式的具体应用。

    一. Singleton模式

    1. 目标:确保一个类在运行时,有且仅有一个实例,并提供一个访问它的唯一入口。

    2. 问题:在一些业务场景的要求下或者其他技术上的考量,保证类只有一个实例非常重要

    3. 解决方案:屏蔽类的公共构造函数,只提供访问该类实例的全局入口,在该入口中只会实例化一次。

    4. 参与者和协作者:Singleton负责创建自己的唯一实例,并提供调用方法,如GetInstance()。

    5. 效果:Singleton模式减少了对象的内存占用,并且降低了对象的创建开销。对于实现Singleton模式,要求该类是线程安全(Thread safe)的。当并发很高时,Singleton模式可能会存在性能问题。但是,如果类的行为不依赖于类的特定状态,即不存在竞争资源,性能问题几乎可以忽略。

    6. 实现:类中提供一个静态方法GetInstance()获取唯一实例,类的构造函数访问权限设为protected,当然如果你不想控制类的运行时实例数目就不必设此限制。代码请参考07. 设计模式应用案例(下)。UML图如下:

    image

    二. Factory Method模式

    1. 目标:定义一个创建对象的接口,由子类决定创建哪个对象。将实例化推迟到继承接口的子类进行。

    2. 问题:一个类需要实例化另一个类的派生类之一,但在当前上下文环境中不知道是那一个派生类,需要在该类自身的派生类中决定。

    3. 解决方案:由主类的派生类决定实例化策略。在语言层面,通过多态和覆盖(override)实现派生类的特殊行为。

    4. 参与者和协作者:Product是工厂方法所创建的对象类型的接口或者是服从Product接口约束的泛型。Creator是定义工厂方法的接口。

    5. 效果:客户将需要派生Creator,以创建一个特定的ConcreteProduct对象。

    6. 实现:在抽象类中使用一个抽象方法,派生类必须实现该方法,编写实例化具体类的代码。代码请参考07. 设计模式应用案例(下)。UML图如下:

    image

    三. Prototype模式

    1. 目标:用原型对象决定创建对象的种类,并且通过拷贝这些原型创建新的对象。

    2. 问题:主体功能已经确定,部分功能的具体行为需要在运行时,由包含的Prototype的派生类决定。

    3. 解决方案:由主类持有原型类的引用,调用统一接口Clone(),从而根据实现在运行时返回具体类型。

    4. 参与者和协作者:Client请求一个Prototype类,Prototype通过Clone()方法返回具体的对象。

    5. 效果:实现延迟创建具体对象,Client只需关心Prototype类型,而无需关心具体的派生类,根据运行时环境Clone具体派生类。

    6. 实现:将Prototype以构造函数参数形式传入,在Client Operation中调用Prototype Clone接口。Clone方法的具体行为由Prototype的派生类在运行时决定。代码请参考07. 设计模式应用案例(下)。UML图如下:

    image

  • 相关阅读:
    Unreal Engine 4官网教程
    快速上手制作暗黑类游戏动作打击感的一些要点
    充分利用 UE4 中的噪声
    综合帖:多角度闲聊游戏打击感
    鹅厂内部分享:七步教你从无到有做数值
    二叉树、二叉搜索树、平衡二叉树、B树、B+树的精确定义和区别探究
    MySQL的InnoDB索引原理详解
    分布式核心
    Mysql 原理以及常见mysql 索引等
    redis核心原理
  • 原文地址:https://www.cnblogs.com/zhouwei0213/p/3352640.html
Copyright © 2011-2022 走看看