• 1. 单例对 OOP 特性的支持不友好


    我们知道,OOP 的四大特性是封装、抽象、继承、多态。单例这种设计模式对于其中的抽象、继承、多态都支持得不好。为什么这么说呢?我们还是通过 IdGenerator 这个例子来讲解。

    
    public class Order {
      public void create(...) {
        //...
        long id = IdGenerator.getInstance().getId();
        //...
      }
    }
    
    public class User {
      public void create(...) {
        // ...
        long id = IdGenerator.getInstance().getId();
        //...
      }
    }
    

    dGenerator 的使用方式违背了基于接口而非实现的设计原则,也就违背了广义上理解的 OOP 的抽象特性。如果未来某一天,我们希望针对不同的业务采用不同的 ID 生成算法。比如,订单 ID 和用户 ID 采用不同的 ID 生成器来生成。为了应对这个需求变化,我们需要修改所有用到 IdGenerator 类的地方,这样代码的改动就会比较大。

    
    public class Order {
      public void create(...) {
        //...
        long id = IdGenerator.getInstance().getId();
        // 需要将上面一行代码,替换为下面一行代码
        long id = OrderIdGenerator.getIntance().getId();
        //...
      }
    }
    
    public class User {
      public void create(...) {
        // ...
        long id = IdGenerator.getInstance().getId();
        // 需要将上面一行代码,替换为下面一行代码
        long id = UserIdGenerator.getIntance().getId();
      }
    }
    

    除此之外,单例对继承、多态特性的支持也不友好。这里我之所以会用“不友好”这个词,而非“完全不支持”,是因为从理论上来讲,单例类也可以被继承、也可以实现多态,只是实现起来会非常奇怪,会导致代码的可读性变差。不明白设计意图的人,看到这样的设计,会觉得莫名其妙。所以,一旦你选择将某个类设计成到单例类,也就意味着放弃了继承和多态这两个强有力的面向对象特性,也就相当于损失了可以应对未来需求变化的扩展性。

    1. 单例会隐藏类之间的依赖关系
  • 相关阅读:
    Mplayer 音频解码分析
    U盘安装Centos6.3
    U盘安装Centos6.3
    Mplayer 音频解码分析
    Java 基础代码实例 :判断顾客对商品折扣的反应情况。
    Java 基础源码 switch语句判断指定月份属于一年中的哪个季度
    Java 交换值算法 不用中间变量,换运算
    Java基础二维数组代码实例
    private 成员变量 局部变量
    Java继承的基本概念及其限制 总结
  • 原文地址:https://www.cnblogs.com/ukzq/p/14856146.html
Copyright © 2020-2023  润新知