> Java > java지도 시간 > 24가지 공통 디자인 패턴의 주요 사용 포인트와 해당 Java 구현을 요약합니다.

24가지 공통 디자인 패턴의 주요 사용 포인트와 해당 Java 구현을 요약합니다.

php是最好的语言
풀어 주다: 2018-08-06 14:09:30
원래의
3042명이 탐색했습니다.

디자인 패턴은 지속적으로 발생하는 특정 상황에서 특정 문제에 재사용할 수 있는 특정 솔루션 패턴(루틴)입니다. 이 기사에서는 적용 가능한 시나리오, 솔루션 및 해당 Java 구현을 포함하여 생성, 구조 및 동작의 세 가지 범주에 따라 24가지 공통 디자인 패턴을 사용하는 데 필요한 핵심 사항을 요약합니다.

1 개요

1.1 개념

디자인 패턴은 끊임없이 나타나는 특정 "컨텍스트" 아래에 있습니다. 특정 "문제"에:

  • "문제"는 반복되어야 하며 "해결책"은 반복적으로 적용 가능해야 합니다. 🎜🎜#

    "문제"에는 "목표"와 "제약 조건 세트"가 포함되어 있으며 솔루션이 둘 사이의 균형을 맞추면 유용한 패턴입니다.# 🎜🎜#
  • #🎜🎜 #
  • 디자인 패턴은 법적 지침이 아니라 실제 사용 중에 필요에 따라 미세 조정하면 됩니다.

    #🎜🎜 ##🎜 🎜#

    새로운 것처럼 보이는 많은 모드는 실제로 기존 모드의 변형입니다. 디자인 패턴을 사용하여 향후 가능한 변경 사항에 적응하지 않는 한, 디자인 패턴은 더 많은 유형의 더 복잡한 관계를 도입하므로 패턴을 사용하기 위해 패턴을 사용하지 마십시오.
  • 1.2 Six 원칙
  • 6가지 원칙을 합친 영문 이니셜이 SOLID(안정적)이므로 For the SOLID라고도 합니다. 원칙.

  • 1.2.1 단일 책임 원칙

    클래스를 변경하는 데에는 한 가지 이상의 이유가 있어서는 안 됩니다. 하나의 클래스에 여러 책임이 결합되어 있는 것이 아니라 단 하나의 책임만 있습니다(예: 인터페이스와 로직은 분리되어야 함).
1.2.2 개방형 폐쇄 원칙

클래스, 모듈, 함수와 같은 소프트웨어 엔터티는 확장을 위해 열려 있어야 하지만 수정을 위해 닫혀 있어야 합니다.

예 확장을 위해 개방, 폐쇄됩니다. 수정을 위해 인터페이스와 추상 클래스를 사용합니다.
1.2.3 Liskov 대체 원칙

기본 클래스에 대한 포인터나 참조를 사용하는 함수는 이를 알지 못한 채 파생 클래스의 개체를 사용할 수 있어야 합니다.

다음을 확인하세요. 상위 클래스가 나타날 수 있는 곳에 하위 클래스도 확실히 나타날 수 있습니다. 이는 상속 및 재사용의 초석입니다.


1.2.4 최소 지식 원칙

직접 친구하고만 대화하세요.

낮은 의존성, 각 개체는 최대한 독립적이며 상호 작용이 최소화됩니다.


1.2.5 인터페이스 분리 원칙

한 클래스의 다른 클래스에 대한 종속성은 가능한 가장 작은 인터페이스에 따라 달라져야 합니다.

client)는 메소드에 의존해서는 안 됩니다. 사용하지 않습니다. 단일 인터페이스에 여러 기능을 결합하는 대신 여러 인터페이스를 사용하여 기능을 분할하고 결합해 보세요.


1.2.6 종속성 반전 원칙

상위 수준 모듈은 하위 수준 모듈에 의존해서는 안 됩니다.

둘 다 추상화에 의존해야 합니다. 추상화는 세부 사항에 의존해서는 안 됩니다. 세부 사항은 추상화(구체적 클래스)가 아닌 추상화(인터페이스 또는 추상 클래스)에 따라 달라집니다.


1.3 Value

디자인 패턴은 반복적으로 사용되며 대부분의 사람들에게 알려진 분류되고 분류된 코드 디자인 경험의 집합입니다. 디자인 패턴을 사용하는 목적은 코드를 재사용하고, 다른 사람이 코드를 더 쉽게 이해할 수 있도록 하며, 코드 신뢰성을 보장하는 것입니다.

디자인 패턴은 겉으로는 단순해 보이는 문제를 복잡하게 만듭니다. 그러나 "단순한" 디자인은 유연성이 부족하고 현재 프로젝트에서 확장하기 불편하며 다른 프로젝트에서 사용할 수 없습니다. 이는 "일회성 코드"와 같습니다. 디자인 패턴의 코드는 구조가 명확하고 현재 프로젝트에서 확장이 용이하며 다른 프로젝트에도 적용이 가능한 유니버설 디자인입니다.

많은 프로그래머는 디자인 패턴을 접한 후 자신이 다시 태어났고 새로운 단계에 도달했다는 느낌을 받습니다. 디자인 패턴은 프로그래머의 수준을 나누는 기준으로 사용될 수 있습니다.
그러나 패턴의 함정에 빠질 수는 없습니다. 패턴을 사용하기 위해 적용하려고 하면 형식주의에 빠지게 됩니다.

1.4 선택 방법



각 디자인 패턴은 여러 가지 OO 원칙을 의미합니다. 선택할 수 있는 적절한 디자인 패턴이 없는 경우 로 돌아갈 수 있습니다. 선택을 위한 OO 원칙; 이러한 패턴은 경험을 재사용하는 데 사용됩니다. 1) 다른 사람과 의사소통할 때 디자인 패턴의 이름을 언급하는 것은 패턴을 의미합니다.

(2) 패턴을 사용하여 소프트웨어 시스템을 관찰할 수 있습니다. 사소한 사물의 디테일에 얽매이지 않고 디자인 수준 ;

(3) 팀은 디자인 패턴을 사용하여 소통하므로 서로의 견해를 오해하기가 쉽지 않습니다.



1.5 중요 도서

저자: Erich Gamma, Richard Helm, Ralph Johnson, John Vlissides, 나중에 "Gang of Four"로 알려짐 (고프). 두 권의 책이 있습니다:

1.5.1 "헤드 퍼스트 디자인 패턴"

읽기를 적극 권장합니다. 영문 제목은 "Head First Design Patterns"입니다.
예수를 믿는 사람은 반드시 성경을 읽어야 하고, OO(객체지향)를 믿는 사람은 반드시 공식 홈페이지인 Head First Design Patterns 포섬의 "Head First Design Patterns"를 읽어야 합니다. 2004년 이 책은 Jolt Award(영화 분야의 오스카상과 유사)를 수상했습니다.

  • 처음으로 패턴을 분류한 사람으로 소프트웨어 분야에서 큰 도약을 시작했습니다.

  • 패턴 템플릿: 이름, 카테고리, 의도, 동기, 적용 가능성, 클래스 다이어그램, 참가자 및 협업 포함; , 결과, 구현, 예제 코드, 알려진 애플리케이션, 관련 패턴 등

1.5.2 "Design Patterns: The Foundation of Reusable Object-Oriented Software"

영문 제목은 "Design Patterns: Elements of Reusable Object-Oriented Software"입니다. 또한 4인조가 썼습니다.
은 소프트웨어 엔지니어링 분야의 소프트웨어 디자인에 관한 책으로, 소프트웨어 디자인 패턴이라고 불리는 몇 가지 일반적인 소프트웨어 디자인 문제에 대한 표준 솔루션을 제안하고 요약합니다. 이 책은 1994년 10월 21일에 처음 출판되었으며, 2012년 3월 현재 40부가 인쇄되었습니다.

2 분류 및 정의

디자인 패턴은 세 가지 주요 범주로 나눌 수 있으며, 각 범주에는 여러 가지 특정 패턴이 포함되어 있습니다.
쉽게 혼동되는 여러 패턴: 단순 팩토리 S / 추상 팩토리 A / 팩토리 메소드 F / 템플릿 메소드 T

  • "Factory": 이것이 없으면 S/A/F와 같은 인스턴스를 생성하는 데만 사용됩니다. "method"라는 단어가 포함된 T

  • 에는 제한이 없습니다. F/T와 같이 추가 클라이언트 참여가 필요하지 않고 독립적으로 작동할 수 있습니다. S/A와 같은 전화.

2.1 생성 패턴

은 객체 생성 작업을 다른 객체에 두거나 하위 클래스에 연기하는 데 사용됩니다.

2.1.1 싱글톤

클래스에 인스턴스가 하나만 있는지 확인하고 전역 액세스 포인트를 제공하세요.
여러 클래스 로더에서 싱글톤을 사용하면 각 클래스 로더에 고유한 독립 네임스페이스가 있기 때문에 각 로더 유형에서 싱글톤 인스턴스가 생성된다는 점에 유의해야 합니다.
JDK의 싱글톤에는 Runtime.getRuntime()NumberFormat.getInstance()가 포함됩니다. Runtime.getRuntime()NumberFormat.getInstance()
下面总结了四种线程安全的 Java 实现方法。每种实现都可以用 Singleton.getInstance().method(); 调用。

2.1.1.1 饿汉方式

关键思路:作为类的静态全局变量,加载该类时实例化。
缺点是真正使用该实例之前(也有可能一直没用到),就已经实例化,浪费资源。
对于 Hotspot VM,如果没涉及到该类,实际上是首次调用 getInstance() 时才实例化。

/**
 * @author: kefeng.wang
 * @date: 2016-06-07 10:21
 **/public class Singleton {
    private static Singleton instance = new Singleton();    private Singleton() {
    }    // 基于 classLoader 机制,自动达到了线程安全的效果
    public static Singleton getInstance() {        return instance;
    }    public void method() {
        System.out.println("method() OK.");
    }
}
로그인 후 복사
2.1.1.2 懒汉方式

关键思路:在方法 getInstance() 上实现同步。
缺点是每次调用 getInstance() 都会加锁,但实际上只有首次实例化时才需要,后续的加锁都是浪费,导致性能大降。

/**
 * @author: kefeng.wang
 * @date: 2016-06-07 10:21
 **/public class Singleton {
    private static Singleton instance = null;    private Singleton() {
    }    public static synchronized Singleton getInstance() {        if (instance == null) {
            instance = new Singleton();
        }        return instance;
    }    public void method() {
        System.out.println("method() OK.");
    }
}
로그인 후 복사
2.1.1.3 懒汉方式(双重检查加锁)

关键思路:不同步的情况下检查到尚未创建,再同步检查到尚未实例化时,才实例化。以便大大减少同步的情况。
缺点是:要求 JDK5+,否则许多 JVM 对 volatile 的实现导致双重加锁失效。不过现在极少开发者会用 JDK5,所以该缺点关系不大。

/**
 * @author: kefeng.wang
 * @date: 2016-06-07 10:21
 **/public class Singleton {
    private volatile static Singleton instance = null; // 注意 volatile

    private Singleton() {
    }    public static Singleton getInstance() {        if (instance == null) { // 初步检查:尚未实例化
            synchronized (Singleton.class) { // 再次同步(对 Singleton.class)
                if (instance == null) { // 确认尚未实例化
                    instance = new Singleton();
                }
            }
        }        return instance;
    }    public void method() {
        System.out.println("method() OK.");
    }
}
로그인 후 복사
2.1.1.4 内部静态类方式(推荐!)

关键思路:全局静态成员放在内部类中,只有该内部类被引用时才实例化,以达到延迟实例化的目的。这是个完美方案:

  • 确保延迟实例化至 getInstance() 的调用;

  • 无需加锁,性能佳;

  • 不受 JDK 版本限制。

/**
 * @author: kefeng.wang
 * @date: 2016-06-07 10:21
 **/public class Singleton {
    private static class InstanceHolder { // 延迟加载实例
        private static Singleton instance = new Singleton();
    }    private Singleton() {
    }    public static Singleton getInstance() {        return InstanceHolder.instance;
    }    public void method() {
        System.out.println("method() OK.");
    }
}
로그인 후 복사

2.1.2 生成器(Builder)

将对象的创建过程,封装到一个生成器对象中,客户按步骤调用它完成创建。
Java 实现请参考 StringBuilder 的源码,这里给出其使用效果:

StringBuilder sb = new StringBuilder();
sb.append("Hello world!").append(123).append('!');
System.out.println(sb.toString());
로그인 후 복사

2.1.3 简单工厂(Simple Factory) ★

不是真正的“设计模式”。自身是工厂实现类,直接提供创建方法(可多个),可以是静态方法。JDK 中有 Boolean.valueOf(String)Class.forName(String)

/**
 * @author: kefeng.wang
 * @date: 2016-06-09 19:42
 **/public class DPC3_SimpleFactoryPattern {
    private static class SimpleFactory {
        public CommonProduct createProduct(int type) { // 工厂方法,返回“产品”接口,形参可无
            if (type == 1) {                return new CommonProductImplA(); // 产品具体类
            } else if (type == 2) {                return new CommonProductImplB();
            } else if (type == 3) {                return new CommonProductImplC();
            } else {                return null;
            }
        }
    }    private static class SimpleFactoryClient {
        private SimpleFactory factory = null;        public SimpleFactoryClient(SimpleFactory factory) {            this.factory = factory;
        }        public final void run() {
            CommonProduct commonProduct1 = factory.createProduct(1);
            CommonProduct commonProduct2 = factory.createProduct(2);
            CommonProduct commonProduct3 = factory.createProduct(3);
            System.out.println(commonProduct1 + ", " + commonProduct2 + ", " + commonProduct3);
        }
    }    public static void main(String[] args) {
        SimpleFactory factory = new SimpleFactory(); // 工厂实例
        new SimpleFactoryClient(factory).run(); // 传入客户类
    }
}
로그인 후 복사

2.1.4 抽象工厂(Abstract factory) ★

一个抽象类,定义创建对象的抽象方法。继承后的多个实现类中,实现创建对象的方法。
客户端灵活选择实现类,完成对象的创建。
JDK 中采用此模式的有 NumberFormat.getInstance()

2.1.5 工厂方法(Factory method) ★

创建方法的对于抽象类和实现类的分工,与“抽象工厂”类似。
区别在于:本模式无需客户端,自身方法即可完成对象创建前后的操作。

2.1.6 原型(Prototype)

当创建实例的过程很复杂或很昂贵时,可通过克隆实现。比如 Java 的 Object.clone()다음은 스레드로부터 안전한 4가지 Java 구현 방법을 요약한 것입니다. 각 구현은 Singleton.getInstance().method();를 사용하여 호출할 수 있습니다.

2.1.1.1 Hungry Chinese Way
🎜핵심 아이디어: 클래스의 정적 전역 변수로서 클래스가 로드될 때 인스턴스화됩니다. 🎜단점은 인스턴스가 실제로 사용되기 전에 인스턴스화(또는 전혀 사용되지 않을 수 있음)되어 리소스가 낭비된다는 점입니다. 🎜Hotspot VM의 경우 이 클래스가 관련되지 않으면 getInstance()가 처음 호출될 때 실제로 인스턴스화됩니다. 🎜rrreee
2.1.1.2 게으른 방식
🎜핵심 아이디어: getInstance() 메소드에서 동기화를 달성합니다. 🎜 단점은 getInstance()가 호출될 때마다 잠긴다는 점이지만 실제로는 첫 번째 인스턴스화에만 필요하므로 후속 잠금은 낭비이므로 성능이 크게 저하됩니다. 🎜rrreee
2.1.1.3 게으른 방법(이중 확인 잠금)
🎜핵심 아이디어: 동기화되지 않은 경우 아직 생성되지 않았는지 확인하고, 동기화되지 않았음을 동기적으로 확인한 경우에만 인스턴스화합니다. 아직 인스턴스화되지 않았습니다. 동기화 상황을 크게 줄이기 위해. 🎜단점은 JDK5+가 필요하다는 것입니다. 그렇지 않으면 휘발성의 많은 JVM 구현으로 인해 이중 잠금이 실패하게 됩니다. 그러나 현재 JDK5를 사용하는 개발자는 거의 없으므로 이러한 단점은 관련이 없습니다. 🎜rrreee
2.1.1.4 내부 정적 클래스 방법(권장!)
🎜핵심 아이디어: 전역 정적 멤버는 내부 클래스에 배치되고 지연된 인스턴스화 목적을 달성하기 위해 내부 클래스를 참조할 때만 인스턴스화됩니다. 이것은 완벽한 솔루션입니다. 🎜🎜🎜🎜 getInstance() 호출에 대한 지연된 인스턴스화를 보장합니다. 🎜🎜🎜🎜잠금이 필요하지 않으며 성능이 좋습니다. 🎜🎜🎜🎜JDK 버전에 의해 제한되지 않습니다. 🎜🎜🎜rrreee🎜2.1.2 Builder(Builder)🎜🎜는 객체 생성 과정을 생성기 객체로 캡슐화하고 고객이 이를 단계별로 호출하여 생성을 완료합니다. 🎜Java 구현은 StringBuilder 소스코드를 참고하세요. 사용 효과는 다음과 같습니다. 🎜rrreee🎜2.1.3 Simple Factory(Simple Factory) ★🎜🎜는 실제 "디자인 패턴"이 아닙니다. . 이는 정적 메서드일 수 있는 생성 메서드(여러 개일 수 있음)를 직접 제공하는 팩토리 구현 클래스 자체입니다. JDK에는 Boolean.valueOf(String)Class.forName(String)이 있습니다. 🎜rrreee🎜2.1.4 추상 팩토리 ★🎜🎜객체 생성을 위한 추상 메서드를 정의하는 추상 클래스입니다. 여러 상속된 구현 클래스에서 객체를 생성하기 위한 메서드를 구현합니다. 🎜클라이언트는 구현 클래스를 유연하게 선택하여 객체 생성을 완료할 수 있습니다. 🎜이 모드를 사용하는 JDK는 NumberFormat.getInstance()입니다. 🎜🎜2.1.5 팩토리 메소드 ★🎜🎜 메소드 생성에 있어 추상 클래스와 구현 클래스 간의 작업 분담은 "추상 팩토리"와 유사합니다. 🎜차이점은 이 모드에는 클라이언트가 필요하지 않으며 자체 메서드로 개체 생성 전후에 작업을 완료할 수 있다는 것입니다. 🎜🎜2.1.6 프로토타입🎜🎜인스턴스를 만드는 과정이 복잡하거나 비용이 많이 드는 경우 복제를 통해 구현할 수 있습니다. 예를 들어 Java의 Object.clone()입니다. 🎜

2.2 구조 패턴

은 클래스나 객체의 결합 관계에 사용됩니다.

2.2.1 어댑터

한 인터페이스를 다른 예상 인터페이스에 적용하면 인터페이스 불일치로 인한 호환성 문제를 제거할 수 있습니다.
예를 들어 Enumeration<e></e>Iterator<e></e>로, Arrays.asList()T[]로 조정합니다. code>는 <code>List<t></t>에 적용됩니다. Enumeration<E> 适配成 Iterator<E>Arrays.asList()T[] 适配成 List<T>

2.2.2 桥接(Bridge) ★

事物由多个因子组合而成,而每个因子都有一个抽象类和多个实现类,最终这多个因子可以自由组合。
比如多种遥控器+多种电视机、多种车型+多种路况+多种驾驶员。JDK 中的 JDBCAWT

2.2.3 组合(Composite) ★

把对象的“部分/整体”以树形结构组织,以便统一对待单个对象或多个对象组合。
比如多级菜单、二叉树等。

2.2.4 装饰(Decorator)

运行时动态地将职责附加到装饰者上。
扩展功能有两种方式,类继承是编译时静态决定,而装饰者模式是运行时动态决定,有独特优势。
比如 StringReaderLineNumberReader 装饰后,为字符流扩展出了 line 相关接口。

2.2.5 外观(Facade) ★

提供了一个统一的高层接口,用来访问子系统中的一群接口,让子系统更容易使用。
比如电脑的启动(或关闭),是调用CPU/内存/磁盘各自的启动(或关闭)接口。

2.2.6 享元 / 蝇量(Flyweight)

运用共享技术有效地支持大量细粒度的对象。
比如文本处理器,无需为每个字符的多次出现而生成多个字形对象,而是外部数据结构中同一字符的多次出现共用一个字形对象。
JDK 中的 Integer.valueOf(int) 就采用此模式。

2.2.7 代理(Proxy)

proxy 创建并持有 subject 的引用,client 调用 proxy 时,proxy 会转发给 subject。
比如 Java 里的 Collections 集合视图、RMI/RPC 远程调用、缓存代理、防火墙代理等。

2.3 行为型(Behavioral Patterns)

用于类或对象的调用关系。

2.3.1 责任链(Chain of responsibility)

一个请求沿着一条链传递,直到该链上的某个处理者处理它为止。
比如 SpringMVC 中的过滤器。

2.3.2 命令(Command)

将命令封装为对象,可以随意存储/加载、传递、执行/撤消、排队、记录日志等,将“动作的请求者”从“动作的执行者”中解耦。
参与方包括 Invoker(调用者) => Command(命令) => Receiver(执行者)。
比如定时任务、线程任务 Runnable

2.3.3 解释器模式(Interpreter)

用于创建简易的语言解释器,可处理脚本语言和编程语言,为每个规则创建一个类。
比如 JDK 中的 java.util.Patternjava.text.Format

2.3.4 迭代器(Iterator)

提供一种方法,顺序访问一个聚合对象中的各个元素,而无需暴露其内部表现。
比如 JDK 中的 java.util.Iteratorjava.util.Enumeration

2.3.5 中介者(Mediator)

使用一个中介对象,封装一系列的对象交互,中介对象使各对象无需显式相互引用,从而使其耦合松散,而且可以独立地改变它们之间的交互。
比如 JDK 中的 java.util.Timerjava.util.concurrent.ExecutorService.submit()

2.3.6 备忘录(Memento)

备忘录对象用来存储另一个对象的内部状态的快照,并可在外部存储起来,之后可还原到当初的状态。比如 Java 序列化。
比如 JDK 中的 java.util.Datejava.io.Serializable

2.3.7 观察者(Observer)

对象间一对多的依赖,被观察者状态改变时,观察者都会收到通知。
参与方包括 Observable(被观察者) / Observer(观察者)。
比如 RMI 中的事件、java.util.EventListener

2.3.8 状态(State)

对象的内部状态变化时,其行为也随之改变。其内部实现是,定义一个状态父类,为每种状态扩展出状态子类,当对象内部状态变化时,所选的状态子类也跟着切换,但外部只需与该对象交互,而不知道状态子类的存在。
比如视频播放器的停止/播放/暂停等状态。

2.3.9 策略(Strategy)

定义一组算法,分别封装起来,独立于客户之外,算法更改时不影响客户使用。
比如游戏中的不同角色,可以使用各种装备,这些装备可以策略的方式封装起来。
比如 JDK 中的 java.util.Comparator#compare()

2.2.2 Bridge ★🎜🎜사물은 여러 요소로 구성되며 각 요소는 추상 클래스와 여러 구현 클래스를 가지며 결국 이러한 여러 요소를 자유롭게 결합할 수 있습니다. 🎜예를 들어 다양한 리모컨 + 다양한 TV, 다양한 자동차 모델 + 다양한 도로 상황 + 다양한 운전자. JDK의 JDBCAWT 🎜🎜2.2.3 복합 ★🎜🎜객체의 '부분/전체'를 트리 구조로 구성하여 단일 객체 또는 여러 객체의 조합을 균일하게 처리할 수 있습니다. 🎜다단계 메뉴, 이진 트리 등 🎜🎜2.2.4 Decorator🎜🎜 런타임 시 데코레이터에 책임을 동적으로 연결합니다. 🎜함수를 확장하는 방법에는 두 가지가 있습니다. 클래스 상속은 컴파일 타임에 정적으로 결정되는 반면, 데코레이터 모드는 런타임에 동적으로 결정되는데 이는 고유한 장점이 있습니다. 🎜예를 들어 StringReaderLineNumberReader로 데코레이트된 후 line 관련 인터페이스가 문자 스트림에 대해 확장됩니다. 🎜🎜2.2.5 외관 ★🎜🎜 하위 시스템의 인터페이스 그룹에 액세스할 수 있는 통합된 상위 수준 인터페이스를 제공하여 하위 시스템을 더 쉽게 사용할 수 있습니다. 🎜예를 들어, 컴퓨터의 시작(또는 종료)은 CPU/메모리/디스크의 해당 시작(또는 종료) 인터페이스를 호출하는 것입니다. 🎜🎜2.2.6 플라이웨이트🎜🎜공유 기술을 사용하여 수많은 세밀한 개체를 효과적으로 지원합니다. 🎜예를 들어, 텍스트 프로세서는 각 문자가 여러 번 발생하는 경우 여러 개의 글리프 개체를 생성할 필요가 없습니다. 대신 외부 데이터 구조에서 동일한 문자가 여러 번 발생하면 단일 글리프 개체를 공유합니다. JDK의 🎜Integer.valueOf(int)는 이 모드를 채택합니다. 🎜🎜2.2.7 Proxy🎜🎜proxy는 클라이언트가 프록시를 호출하면 주체에 대한 참조를 생성하고 보유합니다. 🎜예를 들어 Java의 컬렉션 컬렉션 뷰, RMI/RPC 원격 호출, 캐시 프록시, 방화벽 프록시 등이 있습니다. 🎜🎜2.3 행동 패턴🎜🎜은 클래스나 객체의 호출 관계에 사용됩니다. 🎜🎜2.3.1 책임 체인🎜🎜요청은 체인의 프로세서가 처리할 때까지 체인을 따라 전달됩니다. 🎜예를 들어 SpringMVC의 필터입니다. 🎜🎜2.3.2 명령(Command) 🎜🎜 명령을 개체로 캡슐화하여 저장/로드, 전송, 실행/취소, 대기, 기록 등이 가능하며 "작업 요청자"는 개체와 분리됩니다. "작업 실행자"가 분리되었습니다. 🎜참여자로는 Invoker(발신자) => Command(명령어) => Receiver(실행자)가 있습니다. 🎜예를 들어 예약된 작업 및 스레드 작업은 실행 가능입니다. 🎜🎜2.3.3 인터프리터 모드(Interpreter)🎜🎜는 스크립팅 언어와 프로그래밍 언어를 처리할 수 있는 간단한 언어 인터프리터를 생성하여 각 규칙에 대한 클래스를 생성하는 데 사용됩니다. 🎜예를 들어 JDK의 java.util.Pattern, java.text.Format입니다. 🎜🎜2.3.4 Iterator(Iterator)🎜🎜 내부 표현을 노출하지 않고 집계 개체의 개별 요소에 순차적으로 액세스하는 방법을 제공합니다. 🎜예를 들어 JDK의 java.util.Iteratorjava.util.Enumeration입니다. 🎜🎜2.3.5 중재자🎜🎜 중재 객체를 사용하여 일련의 객체 상호 작용을 캡슐화합니다. 중재 객체는 객체가 서로를 명시적으로 참조할 필요가 없으므로 결합을 느슨하게 하고 독립적으로 변경할 수 있습니다. 🎜예를 들어 JDK의 java.util.Timerjava.util.concurrent.ExecutorService.submit()입니다. 🎜🎜2.3.6 Memento🎜🎜 Memento 객체는 다른 객체의 내부 상태에 대한 스냅샷을 저장하는 데 사용되며 외부에 저장할 수 있으며 나중에 원래 상태로 복원할 수 있습니다. Java 직렬화와 같은. 🎜예를 들어 JDK의 java.util.Datejava.io.Serialized입니다. 🎜🎜2.3.7 관찰자🎜🎜객체 간 일대다 종속성. 관찰된 객체의 상태가 변경되면 관찰자에게 알림이 전송됩니다. 🎜참여자로는 Observable/Observer가 있습니다. 🎜예를 들어 RMI의 이벤트, java.util.EventListener. 🎜🎜2.3.8 State🎜🎜객체의 내부 상태가 변경되면 동작도 변경됩니다. 내부 구현은 상태 상위 클래스를 정의하고 각 상태에 대한 상태 하위 클래스를 확장하는 것입니다. 객체의 내부 상태가 변경되면 선택한 상태 하위 클래스도 그에 따라 전환되지만 외부는 객체와 상호 작용하기만 하면 되며 이를 알 수 없습니다. 상태 하위 클래스의 존재. 🎜예를 들어 비디오 플레이어의 중지/재생/일시 중지 상태입니다. 🎜🎜2.3.9 전략🎜🎜 별도로 캡슐화되고 고객과 독립적인 알고리즘 세트를 정의합니다. 알고리즘이 변경되더라도 고객 사용에 영향을 미치지 않습니다. 🎜예를 들어, 게임 속 다양한 캐릭터는 다양한 장비를 사용할 수 있으며 이러한 장비를 전략적으로 패키지화할 수 있습니다. 🎜예를 들어 JDK의 java.util.Comparator#compare()입니다. 🎜

2.3.10 템플릿 메서드(Template method) ★

최상위 논리적 프레임워크("템플릿 메서드"라고 함)는 추상 클래스에 정의되어 있으며, 일부 단계(인스턴스를 생성할 수 있음) 또는 기타 작업)은 Subclass 구현 자체가 독립적으로 작동할 수 있을 때까지 지연됩니다.
서브클래스에서 구현한 작업이 인스턴스를 생성하는 경우 템플릿 메서드는 팩토리 메서드 패턴이 되므로 팩토리 메서드는 특수 템플릿 메서드입니다.

2.3.11 방문자 ★

방문자의 데이터 구조를 수정하지 않고 방문자에 액세스 작업이 캡슐화되어 액세스되는 인터페이스를 제공합니다.
적용 가능한 시나리오는 방문자가 안정적이지만 방문자가 유연하거나 방문자가 다양한 유형의 작업을 수행하는 것입니다.

2.4 복합 패턴(Compound)

두 개 이상의 패턴을 결합하여 자주 발생하는 일반적인 문제를 해결하는 솔루션을 만듭니다.
사용 사례: MVC 패턴(모델/뷰/컨트롤러), Observer, Strategy, Composite, Factory, Decorator 및 기타 패턴을 사용합니다.
사용 사례: 가전제품 = 인터페이스 + 데이터 + 로직 제어, 쇼핑몰 = 매장 + 창고 + 로직 제어.

3 참조 문서

Wikipedia: 디자인 패턴
Wikipedia: 소프트웨어 디자인 패턴
TutorialsPoint: 디자인 패턴

Design A 패턴은 지속적으로 발생하는 특정 상황에서 특정 문제에 대해 반복적으로 사용할 수 있는 특정 솔루션 패턴(루틴)입니다. 이 기사에서는 적용 가능한 시나리오, 솔루션 및 해당 Java 구현을 포함하여 생성, 구조 및 동작의 세 가지 범주에 따라 24가지 공통 디자인 패턴을 사용하는 데 필요한 핵심 사항을 요약합니다.
관련글:

자바의 일반적인 디자인 패턴에 대한 자세한 설명 - 팩토리 패턴

메모에 대한 자세한 설명 디자인 패턴 프로그래밍의 Java 구현에서 패턴 및 해당 응용 프로그램

위 내용은 24가지 공통 디자인 패턴의 주요 사용 포인트와 해당 Java 구현을 요약합니다.의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

관련 라벨:
원천:php.cn
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
최신 이슈
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿