设计模式之单例

code address:

http://download.csdn.net/detail/kaikai_sk/9872762

单例模式的意义

有些对象我们只需要一个:线程池、缓存、硬件设备等
如果多个实例会有造成冲突、结果的不一致性等问题
是否可以用静态变量方式来实现?
或者程序员之间协商个全局变量?
单例模式:确保一个类最多只有一个实例,并提供一个全局访问点

类图

这里写图片描述

实现

package simple;

public class Singleton
{
    private static Singleton uniqueInstance;

    private Singleton()
    {
    }

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

一个巧克力工厂的例子

package Factory;

import simple.Singleton;

public class ChocolateFactory
{
    private boolean empty;
    private boolean boiled;

    private static ChocolateFactory uniqueInstance;

    private ChocolateFactory()
    {

    }

    public static ChocolateFactory getInstance()
    {
        if(uniqueInstance==null)
        {
            uniqueInstance=new ChocolateFactory();
        }
        return uniqueInstance;
    }

    public void fill()
    {
        if(empty)
        {
            //添加原料动作
            empty=false;
            boiled=false;
        }
    }

    public void boil()
    {
        if(!empty && !boiled)
        {
            //煮沸
            boiled =true;
        }
    }

    public void drain()
    {
        if(!empty && boiled)
        {
            //倒出巧克力
            empty=true;
        }
    }
}

经典单例模式的优化

  1. 多线程问题
    优化:
    同步(synchronized)getInstance方法
    public static synchronized ChocolateFactory getInstance()
     {

        if (uniqueInstance == null) 
        {
                    uniqueInstance = new ChocolateFactory();

            }
        }

        return uniqueInstance;

    }

“急切”创建实例

public static ChocolateFactory uniqueInstance = new ChocolateFactory ();

双重检查加锁

public volatile static ChocolateFactory uniqueInstance = null;
    public static ChocolateFactory getInstance() {

        if (uniqueInstance == null) {
            synchronized (ChocolateFactory.class) {
                if (uniqueInstance == null) {
                    uniqueInstance = new ChocolateFactory();
                }
            }
        }

        return uniqueInstance;

    }
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值