浅学设计模式(一)


目录:

(1)设计模式概述

(2)OOP七大原则

(3)单例模式

       饿汉式单例:

       懒汉式单例:

       静态内部类单例:

             但是反射可以破坏单例:


(1)设计模式概述

浅学设计模式(一)_第1张图片

浅学设计模式(一)_第2张图片 

浅学设计模式(一)_第3张图片 浅学设计模式(一)_第4张图片

创建性模式:描述怎样去创建一个对象,主要特点是想办法让对象的创跟使用分离 

 结构性模式:主要描述将类获取对象,按照某种布局组成更大的结构

 行为性模式:主要描述类和对象之间,怎么相互协作,完成单个对象无法完成的任务

(2)OOP七大原则

面向对象七大原则

浅学设计模式(一)_第5张图片

 开闭原则:是当应用需求发生改变的时候, 尽量不去修改原来的代码,可以在上面进行扩展

里氏替换原则:子类可以扩展父类的功能,但是尽量不要改变父类原有的功能

单一职责原则:理解为一个对象不应该承担太多的职责,一个方法尽可以干好一件事情

迪米特法则:理解ABC

浅学设计模式(一)_第6张图片

 

合成复用原则:比如说狗和动物是is a的关系  人的身体各个部位和人是has a的关系

浅学设计模式(一)_第7张图片 

 (3)单例模式

饿汉式单例:

一上来就把对象加载了,造成资源的浪费

浅学设计模式(一)_第8张图片

 懒汉式单例:

如下实现方式:

(1)构造器私有;

(2)用一个私有的静态变量引用实例;

(3)提供一个共有的静态方法获取实例;

浅学设计模式(一)_第9张图片

 但是在多线程下不支持:在并发下是有问题的

浅学设计模式(一)_第10张图片

执行每次结果不一样:

浅学设计模式(一)_第11张图片 

浅学设计模式(一)_第12张图片 

 我们需要加一把锁来解决多线程的问题:

浅学设计模式(一)_第13张图片

浅学设计模式(一)_第14张图片 

但是代码也不是安全的,也有可能出现问题:

new LazyMan A线程可能执行的顺序1 3 2   当在有B线程认为LazyMan是不等于null,执行return lazyMan此时lazyMan还没有完成构造,就出现问题

浅学设计模式(一)_第15张图片 需要为了避免指令重排,加关键字volatile

 浅学设计模式(一)_第16张图片

 静态内部类单例:浅学设计模式(一)_第17张图片

 

但是反射可以破坏单例:

通过无参构造器创建对象破坏单例

浅学设计模式(一)_第18张图片

可以创建的对象的已经不是一个值了 

 浅学设计模式(一)_第19张图片

 解决在加一个锁:

浅学设计模式(一)_第20张图片

 此时在创建会报异常

浅学设计模式(一)_第21张图片 

 但是如果都用构造创建对象:又出现了问题

浅学设计模式(一)_第22张图片

 可以写一个变量标志:解决上面

浅学设计模式(一)_第23张图片

 这样就解决上面的:

浅学设计模式(一)_第24张图片

 

但是还可以破坏:又可以创建两个对象了

浅学设计模式(一)_第25张图片

 浅学设计模式(一)_第26张图片

 

可以使用枚举解决单例:反射不能破坏枚举

浅学设计模式(一)_第27张图片

 浅学设计模式(一)_第28张图片

 尝试使用反射破坏:

使用无参的构造

1dce1dced778460ebc8aaa68ccc36632.png

 

浅学设计模式(一)_第29张图片

 包的错误不是我们想要的结果

 去反编译查看一下,里面还是有无参构造浅学设计模式(一)_第30张图片

 使用jad再次进行反编译:

浅学设计模式(一)_第31张图片

打开发现它是有两个参数 

浅学设计模式(一)_第32张图片 

 修改反射的构造参数:

浅学设计模式(一)_第33张图片

在次运行:出现了正常的结果,枚举不能使用反射 

浅学设计模式(一)_第34张图片

 

 

你可能感兴趣的:(笔记,java,html,开发语言)