码迷,mamicode.com
首页 > 其他好文 > 详细

GOF23设计模式之单例模式

时间:2018-11-26 00:21:47      阅读:176      评论:0      收藏:0      [点我收藏+]

标签:you   有一个   ref   vat   null   tps   ack   color   wan   

GOF23设计模式(Group Of Four)

为国外很有名的四个大牛总结的23总常见的套路

分类:

1)创建型模式

单例模式、工厂模式、抽象工厂模式、建造者模式、原型模式

2)结构型模式

适配器模式、桥接模式、装饰模式、组合模式、外观模式、享元模式、代理模式

3)行为型模式

模板方法模式、命令模式、迭代器模式、观察者模式、中介者模式、备忘录模式、解释器模式、状态模式、策略模式、职责链模式、访问者模式

 

单例模式

核心作用:保证一个类只有一个实例,并且提供一个访问该实例的全局访问点

单例模式的优点:

由于单例模式只生成一个实例,减少了系统性能开销。

单例模式可以在系统设置全局的访问点,优化共享资源访问。例如可以设计一个单例类,负责所有数据表的映射处理。

常见的五种单例模式的实现方式:

主要:

饿汉式(线程安全,调用效率高。但是,不能延时加载。)

package cn.taosir.design.create.singleton;

/**
 * 饿汉式
 * @author taosir
 *
 */
public class HungryType {

    //类初始化时立即加载(不具备延时加载的优势),由于加载类时天然是线程安全的
    private static HungryType hungryType=new HungryType();
    
    //构造方法私有化
    private HungryType() {};
    
    //开放方法供外部提取实例,方法不需要同步,调用效率高
    public static HungryType getInstance() {
        return hungryType;
    }
}

懒汉式(线程安全,调用效率不高。但是,可以延时加载。)

package cn.taosir.design.create.singleton;
/**
 * 懒汉式
 * @author taosir
 *
 */
public class LazyType {
    
    //类初始化时,不初始化这个对象(延时加载,真正需要的时候才创建实例)
    private static LazyType lazyType;
    
    //构造方法私有化
    private LazyType() {};
    
    //方法同步,调用效率低
    public static synchronized LazyType getInstance() {
        if(lazyType==null)
            lazyType=new LazyType();
        return lazyType;
    }
}

其他:

双重检测锁式(由于JVM底层内部模型原因,偶尔会出现问题,不建议使用)

静态内部类式(线程安全,调用效率高。但是,可以延时加载,结合了饿汉式和懒汉式的优点)

package cn.taosir.design.create.singleton;
/**
 * 静态内部类实现
 * @author taosir
 *
 */
public class StaticInner {

    //使用一个静态的内部类来创建实例,当使用下面的StaticInnerInstance.staticInner时才会初始化
    private static class StaticInnerInstance{
        private static final StaticInner staticInner=new StaticInner();
    }
    
    //方法没有同步,调用效率高
    public static StaticInner getInstance() {
        return StaticInnerInstance.staticInner;
    }
    
    //私有化构造方法
    private StaticInner() {}
}

枚举单例(线程安全、调用效率高,不能延时加载)

package cn.taosir.design.create.singleton;
/**
 * 枚举单例
 * @author taosir
 *
 */
public enum Enumeration {

    //这个枚举元素本身就是单例
    INSTANCE;
    
    //添加自己需要的操作
    public void doYouWantToDo() {
        
    }
}

 

GOF23设计模式之单例模式

标签:you   有一个   ref   vat   null   tps   ack   color   wan   

原文地址:https://www.cnblogs.com/it-taosir/p/10017549.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!