设计模式-创建型

设计模式分为创建型、结构型和行为型。
创建型(5种):需要new一个对象出来。包括:单利模式、工厂模式、抽象工厂模式、原型模式、创建者模式。

1、单利模式

在内存中只有一个实例,常用于工具方法,缓存,读取配置文件等操作,或者占用内存比较大的对象。

有5种:

  • 饿汉式
  • 懒汉式(懒加载)
  • 双重检查
  • 静态内部类
  • 枚举

饿汉式
线程安全,但是不能懒加载。会造成内存浪费
原理:虚拟机在类加载阶段会初始化静态变量,并保证该过程的线程安全。所以静态变量instance只会被初始化一次。(instance实例的创建放在静态代码块中也可以)

懒汉式
1)在调用时在创建实例对象。缺点是线程不安全。不推荐在这里插入图片描述
2)安全式的懒汉式
不推荐,每次调用都会先获取锁,性能低下。
在这里插入图片描述

双重锁校验
线程安全,懒加载,性能高,推荐使用。注意:instance使用volatile修改时为了防止指令重排。

static class Sington {
        private Sington(){}
        private static volatile Sington instance ;
        public static Sington getInstance(){
            if (instance == null){
                synchronized (Sington.class){
                    if (instance == null) {
                        instance = new Sington();
                    }
                }
            }
            return  instance;
        };
    }

静态内部类
原理:类Sington在装载时,静态内部类不会被装载,只有在调用getInstance时,才会被加载,又由于静态变量INSTANCE在类加载时会被创建,并且由虚拟机保证线程安全。
所以该种方法具有懒加载、线程安全的优点,推荐使用。

static class Sington {
        private Sington(){}
        private static class SingtonInstance {
            private static  Sington INSTANCE = new Sington();
        }
        
        public static Sington getInstance(){
            return SingtonInstance.INSTANCE;
        }
    }

枚举实现单利
枚举线程安全,还可以防止反序列化修改。推荐使用

enum Sington {
        INSTANCE;
        public void doSomething(){};
    }
```java

单利模式在JDK中的使用Runtime
## 2、简单工厂模式
一个接口有多个子类,工厂模式按照一定的条件,将类的创建延迟到了子类中。
![在这里插入图片描述](https://img-blog.csdnimg.cn/5a0fe56ac956400dbf4d6eb3bef8f729.png?x-oss-process=image/watermark,type_ZHJvaWRzYW5zZmFsbGJhY2s,shadow_50,text_Q1NETiBAcXFfMjA4NDY3Njk=,size_20,color_FFFFFF,t_70,g_se,x_16)

## 3、抽象工厂
围绕一个超级工厂创建其他工厂。该超级工厂又称为其他工厂的工厂。有一个抽象工厂用于根据不同的场景创建不同的工厂,各个工厂再按照自己工厂(一个接口)的要求去生产。

场景:在一个产品族里面,定义多个产品。比如时装有男装、女装。男装又有夏装和秋冬装;女装也有夏装和秋冬装。我们使用男装工厂去生产男装的夏装和秋冬装。使用女装工厂去生产女装的衣服。

![在这里插入图片描述](https://img-blog.csdnimg.cn/50ed8201b921450999d351acefe1ed41.png?x-oss-process=image/watermark,type_ZHJvaWRzYW5zZmFsbGJhY2s,shadow_50,text_Q1NETiBAcXFfMjA4NDY3Njk=,size_20,color_FFFFFF,t_70,g_se,x_16)
jdk中的Calendar使用的是工厂模式
## 4、原型模式
用于创建重复的对象,同时又能保证性能,当直接创建对象的代价比较大时,则采用这种模式。

场景: 1、资源优化场景。 2、类初始化需要消化非常多的资源,这个资源包括数据、硬件资源等。3、通过 new 产生一个对象需要非常繁琐的数据准备或访问权限,则可以使用原型模式。4、一个对象需要提供给其他对象访问,而且各个调用者可能都需要修改其值时,可以考虑使用原型模式拷贝多个对象供调用者使用。

## 5、建造者模式
使用多个简单的对象一步一步构建成一个复杂的对象。

使用场景: 1、需要生成的对象具有复杂的内部结构。 2、需要生成的对象内部属性本身相互依赖。

JDK中的StringBuilder使用该模式。
构建校验规则的时候,可以有1条,2条,3条规则....
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值