设计模式之---单件模式

一、模式定义

    保证一个类仅有一个实例,并提供一个访问它的全局访问点。

 

二、所体现出的设计原则

    这里重新归纳一下软件设计中的几个原则:

    1.OCP法则:开闭法则(Open-Closed Principle)一个软件系统应当对扩展开放,对修改关闭。
    描述:通过扩展已有软件系统,可以提供新的行为,以满足对软件的新的需求,使变化中的软件有一定的适应性和灵活性。同时已有软件模块,特别是最重要的抽象层模块不能再修改,这使变化中的软件系统有一定的稳定性和延续性。
    实现原则:把抽象接口和实现分离。


    2.LSP法则: Liskov Substitution Principle(里氏代换原则)
    描述:这是继承的特征,子类型(subtype)必须能够替换它们的基类型。


    3.DIP法则: 依赖倒置(Dependence Inversion Principle)
    表述:抽象不应当依赖于细节;细节应当依赖于抽象;要针对接口编程,不针对实现编程。具体讲就是 要依赖于抽象,不要依赖于具体。
    实现原则:传递参数时,或者在组合聚合关系中,尽量引用层次高的类。


    4.ISP原则:接口隔离原则(Interface Segregation Principle)
    描述:每一个接口应该是一种角色,不多不少,不干不该干的事,该干的事都要干。这类似编码原则中的最小权限法则。


    5.CARP法则: 合成/聚合复用原则(Composite/Aggregate Reuse Principle或CARP)也叫做合成复用(CRP)原则(Composite Reuse Principle
    描述:要尽量使用合成/聚合,尽量不要使用继承。这就是has a和is a的的问题


    6. 迪米特法则(LoD)迪米特法则(Law of Demeter或简写LoD)又叫最少知识原则(Least Knowledge Principle或简写为LKP)
    描述:一个对象应当对其它对象有尽可能少的了解。其它表述:这实际上就是设计高内聚低耦合的要求,有人形象地称谓“不要和陌生人讲话”。

    似乎找不到单件模式符合的哪一项,>_< 

 

三、UML图示

        简单反而画不出来了。。。        

 

四、应用场景

       单件模式常用来代表系统中的某种唯一的资源,比如说文件系统,资源管理器等等。

 

五、注意事项

          单件模式有几种实现,比如说:直接将本对象的引用定义成static final类型,然后在全局唯一访问接口中返回此引用。

          private static final  MySingleton _instance = new MySingleton();

          public  MySingleton getinstance() {

                return _instance;

          }

       这种写法简单易记,并且没有线程安全的问题。但缺点是不能继承。

       还有一种做法可以满足继承的需要:全局统一访问接口仍在父类中定义,同时父类中维护一张映射表,key为子类名称,value为子类实例的引用。

       但我觉得单件模式还是不要继承的好,继承单例总感觉不对劲。

 

六、举例说明

       比如说做一个FTP工具,需要设计一个FTP Session的管理者对象,来实现诸如FTP Session的创建,销毁,存储等等。此时这个管理者对象就是全局唯一的访问FTP Session的点,所以设计成单件模式就比较适合了。

 

七、代码示例

      维基百科:http://zh.wikipedia.org/wiki/%E5%8D%95%E4%BE%8B%E6%A8%A1%E5%BC%8F
 

你可能感兴趣的:(设计模式之---单件模式)