From 9aebc4660fd0cd02d43f03e81d16178fbd00447b Mon Sep 17 00:00:00 2001 From: peierlong Date: Wed, 5 Sep 2018 16:59:23 +0800 Subject: [PATCH] =?UTF-8?q?=E5=8D=95=E4=BE=8B=E6=A8=A1=E5=BC=8F=E6=B7=BB?= =?UTF-8?q?=E5=8A=A0=E6=9E=9A=E4=B8=BE=E5=AE=9E=E7=8E=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- notes/设计模式.md | 48 +++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 48 insertions(+) diff --git a/notes/设计模式.md b/notes/设计模式.md index 9d9ab38f..b893599c 100644 --- a/notes/设计模式.md +++ b/notes/设计模式.md @@ -179,6 +179,52 @@ public class Singleton { 该实现可以防止反射攻击。在其它实现中,通过 setAccessible() 方法可以将私有构造函数的访问级别设置为 public,然后调用构造函数从而实例化对象,如果要防止这种攻击,需要在构造函数中添加防止实例化第二个对象的代码。但是该实现是由 JVM 保证只会实例化一次,因此不会出现上述的反射攻击。 +#### Ⅵ 枚举实现 + +使用单元素的枚举类型来实现单例模式,相对于常规的单例模式,枚举实现的单例天生具有防止反射实例化对象和反序列化产生实例化对象,而且代码更加简洁,非常适合单例模式场景下使用。以下是枚举单例模式的实现。 + +```java + +public enum EnumSingleton { + INSTANCE; //单元素枚举实现单例 + + private String objName; + + public String getObjName() { + return objName; + } + + public void setObjName(String objName) { + this.objName = objName; + } + + public static void main(String[] args) { + // 单例测试 + EnumSingleton firstSingleton = EnumSingleton.INSTANCE; + firstSingleton.setObjName("firstName"); + System.out.println(firstSingleton.getObjName()); + + EnumSingleton secondSingleton = EnumSingleton.INSTANCE; + secondSingleton.setObjName("secondName"); + System.out.println(firstSingleton.getObjName()); + System.out.println(secondSingleton.getObjName()); + + // 反射获取实例测试 + try { + Constructor constructor = EnumSingleton.class.getDeclaredConstructor(); + constructor.setAccessible(true); + EnumSingleton enumSingleton = constructor.newInstance(); + System.out.println(enumSingleton.getObjName()); + } catch (Exception e) { + e.printStackTrace(); + } + + } +} + +``` + + ### Examples - Logger Classes @@ -2990,3 +3036,5 @@ public class ImageViewer { - [Design Patterns](http://www.oodesign.com/) - [Design patterns implemented in Java](http://java-design-patterns.com/) - [The breakdown of design patterns in JDK](http://www.programering.com/a/MTNxAzMwATY.html) + +