[初]设计模式之单例模式

来源:互联网 发布:人工智能的优势 编辑:程序博客网 时间:2024/05/21 09:01


单例模式使用场景:  保证一个类有且只有一个对象的场景;


五种方式及其差异:


一:

// 单例模式public class Single
private static final Single sIntance = new Single(); //类在初始化时就创建实例
private Single() {} //禁止外部创建实例
public static Single getInstance() { //获取单例
return sIntance;
}
}

模式一的好处:能保证只有一个实例
模式一的弊端:类初始化的时候,就创建了实例,不利于资源时效性//单例模式二
public class Singleton {    private static Singleton mInstance = null;    private Singleton() {}    /**     * 方式二、double-check, 避免并发时创建了多个实例, 该方式不能完全避免并发带来的破坏.     *      * @return     */    public static Singleton getInstance() {        if (mInstance == null) {            synchronized (Singleton.class) {                if (mInstance == null) {                    mInstance = new Singleton();                }            }        }        return mInstance;    }}

    /**     * 方式三 : 在第一次加载SingletonHolder时初始化一次mOnlyInstance对象, 保证唯一性, 也延迟了单例的实例化,     * 如果该单例比较耗资源可以使用这种模式.     *      * @return     */    public static Singleton getInstanceFromHolder() {        return SingletonHolder.mOnlyInstance;    }
    /**     * 静态内部类     *      *     */    private static class SingletonHolder {        private static final Singleton mOnlyInstance = new Singleton();    }

     /**     *  方式四 : 枚举单例, 线程安全     *     */    enum SingletonEnum {        INSTANCE;        public void doSomething() {            System.out.println("do sth.");        }    }    
     /**     * 方式五 : 注册到容器, 根据key获取对象.一般都会有多种相同属性类型的对象会注册到一个map中     * instance容器     */    private static Map<string singleton=""> objMap = new HashMap<string singleton="">();    /**     * 注册对象到map中     * @param key     * @param instance     */    public static void registerService(String key, Singleton instance) {        if (!objMap.containsKey(key) ) {            objMap.put(key, instance) ;        }    }    /**     * 根据key获取对象     * @param key     * @return     */    public static Singleton getService(String key) {        return objMap.get(key) ;    }

不管以哪种形式实现单例模式,它们的核心原理都是将构造函数私有化,并且通过静态方法获取一个唯一的实例,
在这个获取的过程中你必须保证线程安全、反序列化导致重新生成实例对象等问题,该模式简单,但使用率较高。

优点

  • 由于单例模式在内存中只有一个实例,减少了内存开支,特别是一个对象需要频繁地创建、销毁时,而且创建或销毁时性能又无法优化,单例模式的优势就非常明显。
  • 由于单例模式只生成一个实例,所以减少了系统的性能开销,当一个对象的产生需要比较多的资源时,如读取配置、产生其他依赖对象时,则可以通过在应用启动时直接产生一个单例对象,然后用永久驻留内存的方式来解决;
  • 单例模式可以避免对资源的多重占用,例如一个写文件动作,由于只有一个实例存在内存中,避免对同一个资源文件的同时写操作。
  • 单例模式可以在系统设置全局的访问点,优化和共享资源访问,例如可以设计一个单例类,负责所有数据表的映射处理。

缺点

  • 单例模式一般没有接口,扩展很困难,若要扩展,除了修改代码基本上没有第二种途径可以实现。




0 0
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 洗衣机把烟洗了怎么办 吸烟吸的恶心想吐怎么办 显示双方信息的明细怎么办 电脑关不了机了怎么办 xp系统关不了机怎么办 灯的开关闭不了怎么办 灯的开关按不动怎么办 灯开关按不动了怎么办 灯的开关摁不动怎么办 微信群500人满了怎么办 作业帮搜不到题目怎么办呢 金融社保卡密码忘了怎么办 工作未完想从国企辞职怎么办 宫腔粘连术后流血多怎么办 宫腔粘连术后一直流血怎么办? cad图框放不下图怎么办 简历假的入职怎么办 脱贫攻坚怎么看怎么办怎么干 吃的下没力气怎么办 恢复留查公示后怎么办 微语简报删了怎么办 小学生未完成作业作为老师怎么办 抽调人员想回原单位怎么办 扫码支付没成功怎么办 成都电表卡丢了怎么办 社保未满15年怎么办 60岁社保没交满15年怎么办 柴油车dpf是亮了怎么办 贴双眼皮贴眼睛肿了怎么办 送孩子赴澳洲家长怎么办签证? 开指过程中发烧怎么办 大水口热流道有料花怎么办 奶奶疼外孙胜过孙子怎么办 吃了有病的鸡怎么办 博士真毕不了业怎么办 35岁博士毕不了业怎么办 跨校考研失败了怎么办 开发商把网签房卖给我该怎么办 cad中命令行没了怎么办 平板玩游戏很卡怎么办 卵巢包块20厘米怎么办