이 글의 내용은 Java 디자인 패턴이 무엇인지에 관한 것입니다. Java 디자인 패턴에 싱글턴 패턴을 도입하는 것은 참고할만한 가치가 있습니다. 도움이 필요한 친구들이 참고할 수 있기를 바랍니다.
프로그래밍을 처음 배우고 얼마 지나지 않아 Design Patterns이라는 이름을 들었지만 당시에는 아직 완전 초보자였기 때문에 손대지 않았습니다. 직장에서 간단한 비즈니스 코드에 익숙해지고 나서야 정식으로 디자인 패턴을 접하게 되었습니다. 당시 제가 접한 최초의 디자인 패턴은 팩토리 패턴이었는데, 이번 글에서는 싱글 케이스 패턴에 대해 이야기하고 있으며 이에 대해서는 다음 글에서 설명하겠습니다. 싱글 케이스 패턴을 먼저 설명하는 이유는 싱글 케이스 패턴이 가장 단순한 디자인 패턴이기 때문이죠... . 모든 일에는 순서가 있기 때문에 처음에는 쉽고 그다음에는 어렵습니다. 알았어, 말도 안되는 소리는 그만하고 본론으로 들어가자.
설명: 여기에 언급된 소개는 실제 "소개"입니다.
디자인 패턴은 대부분의 사람들에게 알려져 있고 반복적으로 사용되는 분류되고 목록화된 코드 디자인 경험의 집합입니다.
디자인 패턴을 사용한다는 것은 코드를 재사용하고, 다른 사람이 코드를 더 쉽게 이해할 수 있도록 하며, 코드 신뢰성을 보장하기 위한 것입니다.
디자인 패턴에는 23가지 종류가 있습니다. 주요 분류에 따르면 세 가지 주요 범주로 나눌 수 있습니다.
1. 생성 패턴
이러한 디자인 패턴은 new 연산자를 사용하여 객체를 직접 인스턴스화하는 대신 객체를 생성하는 동안 생성 논리를 숨기는 방법을 제공합니다. . 이는 주어진 인스턴스에 대해 어떤 객체를 생성해야 하는지 결정하는 데 있어서 프로그램을 더욱 유연하게 만듭니다.
단일 케이스 패턴
팩토리 패턴
추상 팩토리 패턴
빌더 패턴
프로토타입 패턴
2. 구조적 패턴
이 디자인 패턴은 A에 중점을 둡니다. 클래스와 객체의 결합. 상속 개념은 인터페이스를 구성하고 구성된 객체가 새로운 기능을 획득하는 방식을 정의하는 데 사용됩니다. ...
메모 모드
디자인 패턴의 6가지 원칙
개방-폐쇄 원칙: 확장에는 개방적이고 수정에는 폐쇄됩니다.
리히터 대체 원리: 열고 닫는 원리를 보완합니다. 기본 클래스가 나타날 수 있는 모든 곳에 하위 클래스가 나타날 수 있습니다. LSP는 상속 재사용의 초석입니다. 파생 클래스가 기본 클래스를 대체할 수 있고 소프트웨어 단위의 기능에 영향을 미치지 않는 경우에만 기본 클래스를 재사용할 수 있으며 파생 클래스도 이를 기반으로 새 클래스를 추가할 수 있습니다. 기본 클래스.
종속성 반전 원칙: 인터페이스 프로그래밍은 구체성보다는 추상화에 의존합니다.
인터페이스 격리의 원리: 클래스 간 결합을 줄이기 위해 격리된 여러 인터페이스를 사용해 보세요.
Demeter의 법칙: 엔터티는 다른 엔터티와 가능한 한 적게 상호 작용해야 하며 시스템 기능 모듈을 상대적으로 독립적으로 만들어야 합니다.
싱글턴 패턴이란
싱글턴 모드의 사용 시나리오
,
스레드 풀등입니다.
처음
싱글턴 모드class SingletonTest1 { private SingletonTest1() { } private static final SingletonTest1 instance = new SingletonTest1(); public static SingletonTest1 getInstance() { return instance; } }완전 중국 스타일개인 생성자를 정의하고, 클래스의 정적 개인 변수를 정의한 다음, 공개 정적 메서드를 정의하고, 클래스 값에 대해 null 판단을 수행하고, null이 아닌 경우 직접 반환하고, 그렇지 않으면 빌드 1을 다시 시작하세요.
class SingletonTest2 { private SingletonTest2() { } private static SingletonTest2 instance; public static SingletonTest2 getInstance() { if (instance == null) { instance = new SingletonTest2(); } return instance; } }
简单的介绍了这两种的模式,然后我们再来看看这两种模式的优缺点吧。
饿汉式
优点:写起来很简单,并且不会因为不加synchronized关键字而造成的线程不安全问题。
缺点:当该类被加载的时候,会初始化该实例和静态变量并被创建并分配内存空间,并且会一直占用内存。
饱汉式
优点:写起来很简单,在第一次调用的时候才会初始化,节省了内存。
缺点:线程不安全,多个线程调用可能会出现多个实例。
总结:书写简单,线程不安全,效率还行。
虽然 饱汉式可以通过加上synchronized关键字保证线程安全。但是效率方法来说还不说是最优。
这里在介绍下个人认为在JDK1.5之前最优的两种写法,一种是静态内部类,另一种是双重锁检查。
静态内部类
定义一个私有的构造方法,定义一个该类私有静态的内部类,然后在内部类中定义一个该类的静态变量,然后通过公共的final修饰的静态方法调用返回实例。
class SingletonTest4 { private SingletonTest4(){ } private static class SingletonTest5{ private static SingletonTest4 instance = new SingletonTest4(); } public static final SingletonTest4 getInstance(){ return SingletonTest5.instance; } }
因为该类的内部类是私有的,除了对外公布的公共静态方法getInstance(),是无法访问的。因为它是延迟加载,所以读取读取实例的时候不会进行同步,几乎没有性能的缺陷,而且还是线程安全的,并且不依赖JDK的版本。
双重锁检查
定义一个私有构造方法,通过volatile定义静态私有变量,保证了该变量的可见性,然后定义一个共有的静态方法,第一次对该对象实例化时与否判断,不为空直接返回,提升效率;然后使用synchronized 进行同步代码块,防止对象未初始化时,在多线程访问该对象在第一次创建后,再次重复的被创建;然后第二次对该对象实例化时与否判断,如果未初始化,则初始化,否则直接返回该实例。
class SingletonTest6 { private SingletonTest6() { } private static volatile SingletonTest6 instance; public static SingletonTest6 getIstance() { if (instance == null) { synchronized (SingletonTest6.class) { if (instance == null) { instance = new SingletonTest6(); } } } return instance; } }
这种模式在很长的一段时间内可以说是最优的了,内存占用低,效率高,线程安全,多线程操作原子性。但是有个缺点就是书写麻烦,对新手不太友好。
JDK1.5之后出现了枚举,并且完美支持单例模式,并且线程安全、效率高!但是这些不是最重要的,最重要的是书写超级简单!究竟有多简单,看下面的示例应该就可以了解一下了。。。
枚举单例
enum SingletonTest7{ INSTANCE; }
对的,你没看错,就这点代码,其它不需要了。。。
枚举需要在JDK1.5之后的版本,它无偿提供序列化机制,绝对防止多次实例化,即使在面对复杂的序列化或者反射攻击的时候。这种方法也被Effective Java作者Josh Bloch 所提倡。
单例模式的几种使用就到这了,那么我们来总结下使用单例模式需要注意什么(不包括枚举)。
构造方法私有化(private);
定义一个私有(private)静态(static)实例化对象;
对外提供一个公共(public)静态(static)的方法得到该实例;
相关推荐:
위 내용은 Java 디자인 패턴이란 무엇입니까? Java 디자인 패턴의 싱글톤 패턴 소개의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!