`
ihuashao
  • 浏览: 4721493 次
  • 性别: Icon_minigender_1
  • 来自: 济南
社区版块
存档分类
最新评论

稳固而知新 SINGLETON,MONOSTATE,NULL OBJECT

阅读更多

SINGLETON
一个类在应用程序中只有一个实例,在程序启动的时候被创建,在程序结束时被删除,通常此类作为基础对象,工厂对象或管理对象。
形式1
public class SingletonA {
private static SingletonA instance = null;

private SingletonA() {
}

public static SingletonA getInstance() {
if (instance == null) {
instance = new SingletonA();
}
return instance;
}
}
形式2
public class SingletonB {

private static SingletonB instance = new SingletonB();

private SingletonB() {
}

public static SingletonB getInstance() {
return instance;
}
}
Singleton的构造方法必须要私有化,防止其他类将其实例化。

好处:1适用于任何类,任何类都可以很容易的改造成此模式。
2延迟装载,如果没有使用,不会创建实例。

代价:1无法摧毁,静态实例一直存在。
2不能继承,不能通过派生使子类也实现Singleton模式。
3不透明,使用者必须明确的知道正在使用一个Singleton。
4 频繁的if校验,影响速度。
示例:


应用程序读写LDAP server上的用户信息需要调用JNDI API,从而导致访问JNDI API的代码遍布程序各处,运用Singleton模式构建UserManager类,统一负责访问JNDI API,应用程序读写用户信息只需要调用UserManager.getInsance(),唯一实例保证了不会多个线程同时读写用户信息,而且很容易在UserManager中放入检查,计数,锁等机制。


MONOSTATE
通过把变量变为静态变量,使得类的多个对象可以共享相同的变量。
模型:
public class Monostate {
private static int x = 0;
public void setX(int y) {
x = y;
}
public int getX() {
return x;
}
}

好处: 1 透明性: 使用者不需要知道对象是Monostate
2 可派生: Monostate 的派生类也是Monostate,它们共享相同的静态变量
3 多态性: 在派生类中可以override父类方法,因为方法不是静态(静态方法是不能override的)
代价: 1 不可转换 不能通过派生将常规类转为Monostate模式。
2效率和内存占用,因为既是是对象,有具有静态变量成员,所以会有创建回收的开销和静态成员变量始终占据的内存空间的开销。

实例: 每一个User的实例在界面显示的时候需要提供User的图片,如果每个实例都保存一个Image对象,势必造成庞大的内存开销,在iPASS项目中,如果每个EMS对象都自己保存一个Image对象,1000个EMS时,程序就已经out of memory了(解决过此问题单,而且情况也比本例要复杂)。运用Monostate模式,如果每个User实例可以共享同一个Image实例,节省了内存的开销。
public class User {
private static Image image = null;
private String name;
public Image getImage() {
return image;
}
public void setImage(Image i) {
image = i;
}
}


NULL OBJECT

IEMS e = EmsManager.getEMS("emsname");
if (e != null && !e.isConnective()) {
e.connect();
}
此段代码在程序中随处可见,可以说遍布程序的各个角落,而且很多时候由于忘记对null进行检查而出现NullPointer异常。这种用法本身也是丑陋而且易出错。如果为null时,可以抛出异常,也可以减少出错的可能性,但出错处理的代码更加难以维护, 所以可以采用Null Object模式。
public interface IEMS {
public boolean isConnective();

public void connect();

public static final IEMS NULL = new IEMS() {
public boolean isConnective() {
return false;
};
public void connect() {
};
};
}
IEMS接口中有一个名为NULL的静态变量持有一个匿名IEMS实现体,这个实现体是无效EMS的唯一实例。这样就可以保证了无效EMS只有单一实例。可以通过if(e==IEMS.NULL)来判断e是否为无效EMS。使用该模式避免了对返回值进行NULL验证,即使无效也有返回对象,这个无效对象代表了什么也不做。以下是使用的方式:
IEMS ems = EmsManager.getEMS("emsname");
if (!ems.isConnective()) {
ems.connect();
}
个人觉得也不是任何情况都可以使用此模式,有些时候还是需要返回null。

分享到:
评论

相关推荐

    Singleton

    Singleton模式是一种常用的软件设计模式,它保证一个类只有一个实例,并提供一个全局访问点。这个模式在许多场景下非常有用,例如当系统只需要一个共享的配置对象或者管理某种资源时。Singleton模式的核心特点是单例...

    单例模式Singleton

    private static Singleton instance = null; private Singleton() {} public static Singleton getInstance() { if (instance == null) { instance = new Singleton(); } return instance; } } ``` 为了...

    深入浅出单例Singleton模式

    private static final Singleton singleton = null; private Singleton() {} public static Singleton getInstance() { if (singleton == null) { singleton = new Singleton(); } return singleton; } } ...

    Qt qml Singleton 单例模式

    - 如果Singleton的实例已经被创建,再次尝试创建时,Qml引擎会返回已存在的实例,而不是创建新的。 - 如果Singleton需要在C++中初始化,可以使用`setObject`方法在C++侧设置Singleton的实例。 综上所述,Qt Qml的...

    singleton设计模式java实现及对比

    **Singleton设计模式** Singleton设计模式是软件工程中最常用的设计模式之一,它的主要目的是确保一个类只有一个实例,并提供全局访问点。在Java中,Singleton模式的实现有多种方式,每种方式都有其优缺点,我们将...

    Singleton Pattern 源码

    单例模式(Singleton Pattern)是软件设计模式中的一种,它保证一个类只有一个实例,并提供一个全局访问点。这种模式在很多场景下非常有用,比如控制资源的唯一性、全局配置对象或者缓存服务等。本篇文章将深入探讨...

    Singleton 单例模式

    Singleton 单例模式是软件设计模式中的一种,它限制了类的实例化过程,确保一个类在整个系统中只有一个实例存在。这种模式常用于系统资源管理,比如数据库连接、线程池或者缓存服务等,因为这些资源往往需要全局共享...

    C++完美实现Singleton模式

    ### C++中实现Singleton模式的关键知识点 #### 一、Singleton模式简介 Singleton模式是一种常用的软件设计模式,旨在确保一个类只有一个实例,并提供一个全局访问点。这种模式在系统中经常被用于控制对共享资源...

    Java常用设计模式(SingleTon、FactoryMethod、AbstractFactory)

    抽象工厂模式是工厂方法模式的进一步扩展,它提供了一个创建一系列相关或相互依赖对象的接口,而无需指定它们的具体类。这在处理不同平台或环境下的产品族时非常有用。在Java中,我们可以通过创建抽象工厂类和具体...

    (创建型模式)Singleton模式

    Singleton模式是设计模式中的一种创建型模式,它在软件工程中扮演着重要的角色。这个模式的主要目的是确保一个类只有一个实例,并提供一个全局访问点来获取这个唯一的实例。Singleton模式的应用场景通常涉及到系统...

    C++ 实现的singleton 模式

    **C++实现的Singleton模式详解** Singleton模式是一种常用的软件设计模式,它保证一个类只有一个实例,并提供一个全局访问点。这种模式在很多场景下都非常有用,例如管理共享资源,如数据库连接池,或者确保某个...

    C#设计模式之Singleton模式

    private static Singleton _Instance = null; private Singleton() { Console.WriteLine("Created"); } public static Singleton Instance { get { if (_Instance == null) { _Instance = new Singleton();...

    Singleton单例模式.zip

    private static object syncRoot = new object(); private Singleton() {} public static Singleton Instance { get { if (instance == null) { lock (syncRoot) { if (instance == null) instance ...

    java Singleton单例模式

    Java中的Singleton(单例模式)是一种常用的软件设计模式,它保证了类只有一个实例,并提供一个全局访问点。这种模式在需要频繁创建和销毁对象的场景中特别有用,因为它可以节省系统资源,例如数据库连接或者线程池...

    singleTon单例模式的创建

    如果是 `null`,则创建一个新的 `SingleTon` 实例;如果不是 `null`,则返回已存在的实例。这种方法确保了整个应用程序中只有一个实例存在。 #### 五、线程安全问题 在多线程环境下,上述实现可能存在线程安全问题...

    设计模式之Singleton(单态)

    private static Singleton instance = null; private Singleton() {} public static Singleton getInstance() { if (instance == null) { instance = new Singleton(); // 第一次调用时才实例化 } return...

    Java的Singleton模式代码(免资源分)

    ### Java的Singleton模式详解 #### 一、Singleton模式概述 Singleton模式是一种常用的设计模式,在Java中主要用于确保一个类只有一个实例,并提供一个全局访问点。这种模式对于管理共享资源(如数据库连接池、...

    singleton.zip

    private static final Singleton INSTANCE = new Singleton(); private Singleton() {} public static Singleton getInstance() { return INSTANCE; } } ``` 2. 线程安全的同步方法: 在多线程环境中,为了...

    C#面向对象设计模式纵横谈(2):Singleton 单件(创建型模式) (Level 300)

    private static readonly Lazy<Singleton> lazy = new Lazy<Singleton>(() => new Singleton()); private Singleton() {} public static Singleton Instance => lazy.Value; } ``` Singleton模式虽然方便...

Global site tag (gtag.js) - Google Analytics