单例模式

创建型的模式主要关注的点是:怎么样去创建对象。它的特点就是将对象的创建和使用进行分离。这样的话可以降低耦合度,使用者不需要关注对象的创建细节,对象的创建由相关的工厂来完成,就像我们去商场购买商品时,不需要知道商品是怎么生产出来一样,因为它们由专门的厂商生产。

 

创建型模式分为以下几种。

  • 单例(Singleton)模式:某个类只能生成一个实例,该类提供了一个全局访问点供外部获取该实例,其拓展是有限多例模式。
  • 原型(Prototype)模式:将一个对象作为原型,通过对其进行复制而克隆出多个和原型类似的新实例。
  • 工厂方法(FactoryMethod)模式:定义一个用于创建产品的接口,由子类决定生产什么产品。
  • 抽象工厂(AbstractFactory)模式:提供一个创建产品族的接口,其每个子类可以生产一系列相关的产品。
  • 建造者(Builder)模式:将一个复杂对象分解成多个相对简单的部分,然后根据不同需要分别创建它们,最后构建成该复杂对象。


以上 5 种创建型模式,除了工厂方法模式属于类创建型模式,其他的全部属于对象创建型模式,我们将在之后的教程中详细地介绍它们的特点、结构与应用。

 

单例模式的介绍

1.懒汉模式

package com.lishuai.singleton;

/**
 * 单例模式的懒汉模式
 * 特点:在类加载的时候不会创建对象实例,只有在第一次访问的时候才会创建实例。
 * 并且存在多线程的安全问题
 */
public class LazySingleton {
    private static volatile LazySingleton instance = null;
    private LazySingleton(){}

    public static synchronized LazySingleton getInstance(){
        if(instance==null){
            return new LazySingleton();
        }
        return instance;
    }
}

上面这个模式虽然是线程安全得但是效率不高,即使你写成双重判断得加锁形式也还是效率不高,所以最优解一般推荐静态内部类来实现,这个可以说是单例模式得最优解了

package com.lishuai.singleton;


/**
 * 单例模式的懒汉模式
 * 特点:在类加载的时候不会创建对象实例,只有在第一次访问的时候才会创建实例。
 * 并且存在多线程的安全问题
 */
public class LazySingleton {
    /**
     * 这个实现方法是最有解
     * 实现了延迟加载同时也避免了多线程竞争效率得问题
     * 因为匿名内部类在使用得时候才会被加载,否则不会被加载
     * 因为jvm会保证静态成员只会被加载一次
     */
    private static class Sigle{
        private static LazySingleton INSTANCE=new LazySingleton();
    }

    private LazySingleton(){
        System.out.println("....");
    }

    public static LazySingleton getInstance(){
        System.out.println("创建对象");
        return Sigle.INSTANCE;
    }
}

2.饿汉模式

package com.lishuai.singleton;
/**
 * 单例模式的饿汉模式
 * 不存在现成安全的问题
 * 只是在类加载的时候对象就已经创建好了
 */
public class HungrySingleton {
    private static final HungrySingleton HUNGRY_SINGLETON=new HungrySingleton();
    private HungrySingleton(){}
    public static HungrySingleton getInstance(){
        return HUNGRY_SINGLETON;
    }
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值