创建型之建造者-原型-单例

开头语雀美观笔记

3.1 建造者模式

例子:最常用的可以见Java的builder后会接setter,你可以按照自己的需求任意选择对某个属性setter,结束后就会创建一个你需要的复杂对象。
● 建造者模式是一种创建型设计模式,主要目的是将一个复杂对象的构建过程与其表示相分离,从而可以创建具有不同表示形式的对象。每个组合的东西是变动的,但是组合的算法相对稳定,每个基本部件或者物料是基本不变的。
● 生活实例:去肯德基,汉堡、可乐、薯条、炸鸡翅等是不变的,而其组合是经常变化的,生成出不同的"套餐"。

3.2 原型模式

● 原型模式(Prototype Pattern)是用于创建重复的对象,同时又能保证性能。这种类型的设计模式属于创建型模式,它提供了一种创建对象的最佳方式之一。】
● 这种模式是实现了一个原型接口,该接口用于创建当前对象的克隆。当直接创建对象的代价比较大时,则采用这种模式。例如,一个对象需要在一个高代价的数据库操作之后被创建。我们可以缓存该对象,在下一个请求时返回它的克隆,在需要的时候更新数据库,以此来减少数据库调用
● 需要实现克隆操作:
○ 在 Java 中,实现 Cloneable 接口,重写 clone() 方法。
在这里插入图片描述

3.3 单例模式

● 单例模式是一种创建型设计模式, 让你能够保证一个类只有一个实例, 并提供一个访问该实例的全局节点。一个单一的类负责创建自己的对象,同时确保只有单个对象被创建。这个类提供了一种访问其唯一的对象的方式,可以直接访问,不需要实例化该类的对象。
● 单例模式同时解决了两个问题, 所以违反了单一职责原则:
○ 1 保证一个类只有一个实例。 为什么会有人想要控制一个类所拥有的实例数量? 最常见的原因是控制某些共享资源 (例如数据库或文件) 的访问权限。
○ 它的运作方式是这样的: 如果你创建了一个对象, 同时过一会儿后你决定再创建一个新对象, 此时你会获得之前已创建的对象, 而不是一个新对象。
○ 注意, 普通构造函数无法实现上述行为, 因为构造函数的设计决定了它必须总是返回一个新对象。
在这里插入图片描述

○ 2 为该实例提供一个全局访问节点。 还记得用过的那些存储重要对象的全局变量吗? 它们在使用上十分方便, 但同时也非常不安全, 因为任何代码都有可能覆盖掉那些变量的内容, 从而引发程序崩溃。和全局变量一样, 单例模式也允许在程序的任何地方访问特定对象,但是它可以保护该实例不被其他代码覆盖。
○ 还有一点: 你不会希望解决同一个问题的代码分散在程序各处的。 因此更好的方式是将其放在同一个类中, 特别是当其他代码已经依赖这个类时更应该如此。
○ 如今, 单例模式已经变得非常流行, 以至于人们会将只解决上文描述中任意一个问题的东西称为单例。
所有单例的实现都包含以下两个相同的步骤:
● 将默认构造函数设为私有, 防止其他对象使用单例类的 new运算符。
● 新建一个静态构建方法作为构造函数。 该函数会 “偷偷” 调用私有构造函数来创建对象, 并将其保存在一个静态成员变量中。 此后所有对于该函数的调用都将返回这一缓存对象。
在这里插入图片描述在这里插入图片描述单例模式分为 饿汉模式、懒汉模式、双重锁懒汉模式、静态内部类模式、枚举模式。

1 static

在单类的内部加上一个静态属性,JVM初始化时实例化属性,保存全局的对象。

public class Single{
    public static Map<String,String> cache = new ConcurrentHashMap<String,String>();
}

2 饿汉模式(线程安全)

对象 比较小,在JVM初始化时候内存中实例化,以空间换时间

public class Single{
    //私有属性类型是 本类;创建一个新对象
    private static Single instance = new Single();
    // 私有的构造方法
    private Single(){
    }
    public static Single getInstance(){
        return instance;
    }
}

3 懒汉模式

(线程不安全)什么时候用到对象什么时候再创建对象。

public class Single{
    //私有属性类型是 本类 ;不创建对象
    private static Single instance;
    // 私有的构造方法
    private Single(){
    }
    public static Single getInstance(){
        if(null != instance) return instance;
        return new Single();
    }
}

(线程安全)

public class Single{
    //私有属性类型是 本类 ;不创建对象
    private static Single instance;
    // 私有的构造方法
    private Single(){
    }
    public static synchronized Single getInstance(){
        if(null != instance) return instance;
        return new Single();
    }
}

4 双重检查锁校验(Double Check Lock)

在线程安全的懒汉模式基础上的优化。

public class Single{
    //私有属性类型是 本类 ;不创建对象
    private static volatile Single instance;
    // 私有的构造方法
    private Single(){
    }
    public static Single getInstance(){
        if(null != instance) return instance;
        //执行创建时候加锁
        synchronizedSingle.class){
            if(null == instance){
                instance = new Single;
            }
        }
        return instance;
    }
}

5 类的内部类

不需要加锁

public class Single{
//	静态内部类,内部创建新的类对象;
    private static class SingleHolder{
        private static Single instance = new Single();
    }
//私有构造方法
    private Single(){}

    public static Single getInstance(){
        return SingleHolder.instance;
    }
}

6 CAS

指令集操作–原子操作
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值