美文网首页深究JavaScript
设计模式之单体模式 singleton

设计模式之单体模式 singleton

作者: SCQ000 | 来源:发表于2016-08-18 08:48 被阅读236次

什么是单体模式

在面向对象编程中,我们有时候需要只有一个对象或者实例,如注册表,线程池等。俗话说“一山不容二虎”,往往多个实例会导致软件系统出错,或者导致资源浪费。这时候可以引入单体的设计模式,来限制产生新实例或对象。

单体模式(Singleton Pattern)就是确保某一个类只有一个实例,而且自行实例化并向整个系统提供这个实例。 ---《设计模式之禅》

java实现方式

  • 定义私有访问权限的构造函数,避免被其他类new出新对象
  • 解决方法:
public calss Singleton {
    private static Singleton firstInstance = null;
    private Singleton(){}

    public static Singleton getInstance(){ 
        if(firstInstance == null) { 
            firstInstance = new Singleton();
        }
    }
    return firstInstance;

}

可以从上面例子看出,其他类对这个类的访问可以通过getInstance获得同一个对象。
不过,该方法在高并发条件下,可能出现线程不安全的情况。可以利用synchronized关键字来消除这种问题。这种解决方案也被称为懒汉式解决方法

  • 饿汉式解决方法:
    该解决方案直接在类的内部先实例化一个私有变量。而外部如果需要获得该对象,必须通过getInstance方法来获取。
public calss Singleton {
    private static Singleton firstInstance = new Singleton();
    private Singleton(){}

    public static Singleton getInstance(){ 
            return firstInstance;
    }

}

小扩展:有上限的多例模式

要想实现能产生固定数量的实例类,可以采用以下方法:

public class Apple{
//最多产生三个苹果实例
    private static int maxNumOfApple = 3;
    private static ArrayList<String> nameList = new ArrayList<String> ();
    private static ArrayList<Apple> appleLisst = new ArrayList<Apple> ();
//当前序列号
    private static int countNumOfApple = 0;
    static{
    for(int i = 0; i < maxNumOfApple; i++){ 
        appleList.add(new Apple('第'+ (i+1) + '个'));
    }
    }
    private Apple(){};
    private Apple(String name){ 
        nameList.add(name);
    }
//随机获得实例
    public static Apple getInstance(){ 
        Random random = new Random();
        countNumOfApple = random.nextInt(maxNumOfApple);
        return appleList.get(countNumOfApple);
    }
}

javascript实现方式

  • example1:
var Singleton = {
    attribute: atr1,
    attribute: atr2,
    fun1 : function(){},
    fun2 : function(){}
};

在这个例子中,可以通过Singleton这个对象访问所有的属性和方法。但同时因为javascript对象的易变性,为了避免无意中改写变量,可以将单体对象中的代码组织在命名空间中。
在javascript中,可以利用单体模式封装某些专用的代码,避免其他页面的调用。

 var dom = (function (){ 
    var _counter = 0;
    var instance;

    function generateId() { 
        return 'customId' + _counter++;
    }

    function create(tagName, id) { 
        var el = document.createElement(tagName);
        el.id = id || generateId();
    }

    function createInstance() { 
        return { 
            generateId: generateId,
            create: create
        };
    }

    return { 
        getInstance: function() { 
            return instance || (instance = createInstance());
        }
    }
 }(););

适用场景

  • 要求生成唯一序列号的环境
  • 整个项目需要一个共享访问点或共享数据
  • 创建一个对象消耗资源过多

相关文章

  • 设计模式之单体模式 singleton

    什么是单体模式 在面向对象编程中,我们有时候需要只有一个对象或者实例,如注册表,线程池等。俗话说“一山不容二虎”,...

  • javascript设计模式------单体模式

    一、定义 单体模式(singleton)是javascript中最基本但又最有用的模式之一,它可能比其他任何模式都...

  • 设计模式分类

    经典23种设计模式: 创建型设计模式: Singleton Pattern(单例模式) PrototypePatt...

  • 前端面试题整理

    1、设计模式 知道什么是singleton, factory, strategy, decrator么? 设计模式...

  • 架构师学习路线图

    内功心法 设计模式 软件设计原则 软件设计模式创建型模式Factory 工厂模式Singleton 单例模式Pro...

  • JavaScript设计模式-单体模式

    你将了解一种设计模式-单体模式!你将了解单体模式的优点! 单体模式 单体模式的思想在于保证一个特定类仅有一个实例。...

  • JAVA设计模式 - 单例模式

    JAVA设计模式 - 单例模式 单例模式(Singleton Pattern)是 Java 中最简单的设计模式之一...

  • 图解设计模式之Singleton模式

    Singleton模式即单例模式,故名思意,单例模式会确保任何情况下都绝对只有一个实例,当我们想在程序中表示某个东...

  • 设计模式——单例模式

    设计模式——单例模式 单例模式(Singleton Pattern)是 Java 中最简单的设计模式之一,这种类型...

  • 《松本行弘的程序世界》之设计模式

    什么是设计模式 设计模式是个编程术语,它是指设计上经常反复使用的模式。 主要的23中设计模式 Singleton模...

网友评论

    本文标题:设计模式之单体模式 singleton

    本文链接:https://www.haomeiwen.com/subject/oobuqttx.html