design patterns java
이 튜토리얼에서는 Java의 디자인 패턴에 대해 설명합니다. Singleton, Factory 및 Builder 패턴을 예제와 장점으로 연구합니다.
특정 문제를 해결할 때 몇 가지 모범 사례가 이미 정의되어 있으면보다 효율적으로 해결할 수 있습니다. 이것은 실제로 우리가 이러한 모범 사례를 따르고 더 안정적인 솔루션을 개발하는 데 도움이 될 것입니다.
이들 모범 사례 개발에 사용할 수있는 잘 입증 된 솔루션 문제 해결을 위해“ 디자인 패턴 ”. 숙련 된 OOP 소프트웨어 개발자는 디자인 패턴을 사용하여 특정 작업을 해결합니다.
학습 내용 :
자바의 디자인 패턴
디자인 패턴은 1977 년 Christopher Alexander에 의해 처음 발명되었습니다. 그러나 나중에 Erich Gamma, Richard Helm, John Vlissides 및 Ralph Johnson이라는 네 명의 개발자가 ' 재사용 가능한 객체 지향 소프트웨어의 요소 인 Gang of Four-Design 패턴 '1995 년.
그 이후로 모든 디자인 패턴은 ' 네 가지 디자인 패턴의 갱 ”.
다음 중 데이터 마이닝의 예는 무엇입니까?
디자인 패턴은 일반적인 객체 지향 디자인 문제를 해결하는 데 사용되며 특정 프로그래밍 언어에만 국한되지 않으므로 모든 프로그래밍 언어와 독립적입니다. 따라서 기본적으로 구현이 아니라 아이디어입니다.
따라서 디자인 패턴을 사용하여보다 효율적이고 유연하며 유지 관리 및 재사용이 가능한 프로그램을 개발할 수 있습니다.
디자인 패턴의 장점
다음은 애플리케이션에서 디자인 패턴을 사용할 때의 몇 가지 이점입니다.
- 디자인 패턴은 재사용 가능하며 여러 프로젝트에서 사용할 수 있습니다.
- 디자인 패턴을 사용하여 시스템 아키텍처를 정의 할 수 있습니다.
- 디자인 패턴은 애플리케이션 디자인에 투명성을 제공합니다.
- 디자인 패턴은 이미 잘 테스트되고 입증되었으므로 걱정없이 사용할 수 있습니다.
- 디자인 패턴을 통해 더 나은 시스템을 구축하고 시스템 아키텍처에 대한 명확성을 제공 할 수 있습니다.
디자인 패턴을 사용하는 경우
그렇다면 디자인 패턴을 정확히 언제 사용해야할까요?
일반적으로 SDLC (Software Development Life Cycle)의 초기 분석 및 요구 사항 단계에서 디자인 패턴을 사용합니다. SDLC의 분석 및 요구 사항 단계에서 사용하면이 단계에 대한 자세한 정보를 제공합니다. Java는 내부적으로 디자인 패턴을 지원합니다.
Java의 디자인 패턴은 다음과 같이 분류됩니다.
이 튜토리얼에 관한 한 우리는 창조 디자인 패턴에만 관심이 있습니다.
창작 디자인 패턴은 다음과 같이 추가로 분류됩니다.
이 자습서에서는 다음 디자인 패턴에 대해 설명합니다.
- 싱글 톤 디자인 패턴
- 공장 디자인 패턴
- 빌더 디자인 패턴
Java의 싱글 톤 디자인 패턴부터 시작하겠습니다.
추천 읽기 = >> Flask 기반 앱을위한 디자인 패턴
자바의 싱글 톤 패턴
싱글 톤 패턴은 Java의 생성 패턴 유형입니다. 싱글 톤 패턴은 Java 가상 머신에 클래스의 인스턴스가 하나만 존재하는 디자인 패턴입니다. 싱글 톤 클래스 (싱글 톤 패턴 구현)는 클래스의 인스턴스를 얻기 위해 전역 액세스 포인트를 제공해야합니다.
즉, 싱글 톤 패턴은 클래스의 인스턴스화를 제한합니다. 싱글 톤 패턴은 애플리케이션 용 로거 구현에 사용됩니다. 스레드 풀 구현 또는 캐시에도 사용됩니다.
자바 클래스, java.awt.Desktop 과 java.lang.runtime 또한 싱글 톤 패턴을 사용합니다.
장점
- 싱글 톤 클래스의 인스턴스가 하나만 사용되므로 메모리가 절약됩니다.
- 또한 동일한 단일 객체가 반복적으로 사용되므로 재사용이 가능합니다.
이제 싱글 톤 패턴 구현으로 이동해 보겠습니다.
싱글 톤 패턴의 구현
이미 언급했듯이 싱글 톤 디자인 패턴은 하나의 인스턴스로만 클래스를 제한하며이 인스턴스에는 전역 액세스 지점이 제공됩니다. 이것은 동일한 객체를 반복해서 참조하는 모든 클래스였습니다.
다음 UML 다이어그램은 싱글 톤 패턴을 설명합니다.
위의 UML 다이어그램에서 볼 수 있듯이 싱글 톤 클래스에는 단일 인스턴스가 정의되어 있으며 getInstance () 메서드로 액세스합니다. 따라서 객체 생성을 담당하는 단일 팩토리는 getInstance 메소드를 사용하여 동일한 객체 (클래스에 있음)를 반복해서 반환합니다.
그렇다면 프로그램에서 싱글 톤 패턴을 어떻게 구현할까요?
우리는 싱글 톤 클래스를 만들고 그 생성자를 'private'로 지정하여 클래스를 인스턴스화 할 수 없습니다. 그런 다음 클래스 자체 내에이 싱글 톤 클래스의 개인 인스턴스를 만듭니다. 그런 다음 외부 세계에 싱글 톤 객체를 반환하는 특별한 공용 메서드 getInstance ()가 있습니다.
위에서 설명한이 싱글 톤 클래스의 구현은 아래의 Java 프로그램에 표시됩니다.
class SingletonObject { //create an object of SingletonObject private static SingletonObject instance = new SingletonObject(); //private constructor so that we cannot instantiate the class private SingletonObject(){} //returns the only available object public static SingletonObject getInstance(){ return instance; } public void printMessage(){ System.out.println('Hello from Singleton object!!!'); } } public class Main { public static void main(String() args) { //illegal statement because constructor is private //Compile Time Error: The constructor SingletonObject() is not visible //SingletonObject object = new SingletonObject(); //call getInstance to retrieve the object available from the class SingletonObject object = SingletonObject.getInstance(); //show the message object.printMessage(); } }
산출:
이제 main 메서드를 확인하면 new 연산자를 사용하여 싱글 톤 클래스의 객체를 만들려고하면 컴파일러에서 컴파일 오류가 발생합니다 (메인 메서드의 주석 처리 된 코드 참조). getInstance () 메서드를 사용하여 싱글 톤 클래스의 객체를 얻은 다음 평소와 같이 메서드에 액세스 할 수 있습니다.
자바의 팩토리 패턴
팩토리 패턴은 Java에서 'Factory Method pattern'또는 'Virtual Constructor'라고도합니다. 이 패턴에서 메서드 선언이있는 인터페이스 또는 추상 클래스를 만든 다음이 인터페이스를 구현하거나 클래스를 상속하는 구체적인 클래스 또는 하위 클래스가 클래스의 인스턴스를 만듭니다.
장점
- 팩토리 패턴은 생성 패턴의 한 유형이며 Java에서 가장 일반적으로 사용되는 패턴입니다.
- 팩토리 패턴을 사용하여 실제 생성 로직이 외부 세계에 노출되지 않도록합니다.
따라서 팩토리 패턴을 구현하는 클래스에 이자율을 계산하는 방법이있는 경우 구체적인 클래스는이 클래스를 구현하고 이자율을 계산하는 방법도 구현합니다.
그런 다음 이러한 구체적인 클래스 인스턴스에 액세스하는 팩토리 클래스 인 다른 클래스가 있으므로 이자율을 계산하는 논리가 어떻게 구현되는지 알 수 없습니다. 메서드를 호출하고 출력을 얻습니다.
그렇다면 정확히 언제 Factory Method 패턴을 사용할 수 있습니까?
부모 클래스가 인스턴스 생성을 하위 클래스에 위임하기로 결정하면 팩토리 패턴으로 이동할 수 있습니다 (위에 설명되어 있음). 클래스가 생성 할 하위 클래스를 모를 때 팩토리 메서드를 사용할 수도 있습니다.
이제 팩토리 메서드 패턴의 구현을 살펴 보겠습니다.
공장 패턴의 구현
예를 들어 일반적인 모양 인터페이스를 구현해 보겠습니다. 이 인터페이스에서 원, 직사각형 등과 같은 다양한 구체적인 클래스를 파생 할 수 있습니다. 그런 다음 구체적인 클래스 객체에 액세스하는 shapeFactory 클래스를 갖게됩니다. 이 패턴의 UML은 아래와 같습니다.
이미 설명했듯이 이것은 팩토리 패턴에 대한 UML 다이어그램입니다. 이제 우리는 팩토리 패턴을 보여주는 자바 프로그램을 구현할 것입니다.
//Geometric_shape interface interface Geometric_shape { void draw_shape(); } //Geometric shape classes implementing Geometric_shape interface class Rectangle implements Geometric_shape { @Override public void draw_shape() { System.out.println('Rectangle class::draw_shape() method.'); } } class Square implements Geometric_shape { @Override public void draw_shape() { System.out.println('Square class::draw_shape() method.'); } } class Circle implements Geometric_shape { @Override public void draw_shape() { System.out.println('Circle class::draw_shape() method.'); } } //Factory class for Geometric_shape class ShapeFactory { //shapeObject method gets particular shapeType (circle, Square or Rectangle) public Geometric_shape shapeObject(String shapeType){ if(shapeType == null){ return null; } //retrieve Circle object if(shapeType.equalsIgnoreCase('Circle')){ return new Circle(); //retrieve Rectangle object } else if(shapeType.equalsIgnoreCase('Rectangle')){ return new Rectangle(); ////retrieve Square object } else if(shapeType.equalsIgnoreCase('Square')){ return new Square(); } return null; } } public class Main { public static void main(String() args) { //Create a ShapeFactory object to get different geometric shapes ShapeFactory shapeFactory = new ShapeFactory(); //circle Geometric_shape shape_Circle = shapeFactory.shapeObject('CIRCLE'); //draw method of Circle shape_Circle.draw_shape(); //Rectangle Geometric_shape shape_Rectangle = shapeFactory.shapeObject('RECTANGLE'); //draw method of Rectangle shape_Rectangle.draw_shape(); //Square Geometric_shape shape_Square = shapeFactory.shapeObject('SQUARE'); //draw method of square shape_Square.draw_shape(); } }
산출:
자바의 빌더 패턴
Builder 패턴에서는 단계별 접근 방식을 사용하여 작고 단순한 개체를 사용하여 복잡한 개체를 만듭니다.
따라서 한 번에 생성 할 수없는 객체를 만날 때마다 빌더 패턴으로 이동합니다.
장점
- Builder 패턴을 사용하여 객체의 구성과 표현을 분리 할 수 있습니다.
- 객체의 내부 표현도 변경할 수 있습니다.
- 빌더 패턴을 사용하여 전체 전달 시스템과 같은 복잡한 디자인을 만들 수 있습니다.
Builder 패턴의 실제 예는 주문 된 식품 항목을 수집 한 다음 포장, 청구, 주문 작성, 배송하는 복잡한 단계를 포함하는 식품 주문 시스템입니다.
이 튜토리얼에서는 Builder 패턴을 사용하여 태블릿 주문 시스템의 예를 구현합니다.
빌더 패턴 구현
빌더 패턴에 대한 일반적인 UML 다이어그램은 다음과 같습니다.
위의 다이어그램은 빌더 패턴 UML 다이어그램을 보여줍니다. 위의 다이어그램에서 볼 수 있듯이 Builder 패턴에는 4 개의 구성 요소가 있습니다.
- 생성물: 이것은 빌드 할 복잡한 개체를 나타냅니다.
- 빌더 추상 클래스 : 복잡한 객체를 만드는 데 필요한 모든 기능의 프로토 타입을 포함하는 추상 클래스입니다.
- ConcreteBuilder 클래스 : 이것은 Builder 클래스에서 상속되고 특정 복합 객체를 생성하는 구체적인 클래스입니다. 필요한만큼의 ConcreteBuilder 클래스를 가질 수 있습니다.
- 디렉터 클래스 : 이 클래스는 최종 제품을 생성하는 알고리즘을 제어합니다.
다음 프로그래밍 예제는 태블릿 주문 구축 시스템을 사용하는 빌더 패턴의 데모를 보여줍니다.
import java.util.ArrayList; import java.util.List; //Packing interface for tablets interface Packing { public String pack(); public int price(); } //Tablet class - abstract abstract class Tablet implements Packing{ public abstract String pack(); } //company - extends Tablet abstract class Company extends Tablet{ public abstract int price(); } //Lenovo tablet class Lenovo extends Company{ @Override public int price(){ return 541; } @Override public String pack(){ return 'Lenovo Yoga'; } } //Micromax tablet class MicroMax extends Company { @Override public int price(){ return 338; } @Override public String pack(){ return 'MicroMax'; } } //Tablet type class TabType { private List items=new ArrayList(); //add items public void addItem(Packing packs) { items.add(packs); } //retrieve cost public void getCost(){ for (Packing packs : items) { packs.price(); } } //show all items public void showItems(){ for (Packing packing : items){ System.out.print('Tablet name : '+packing.pack()); System.out.println(', Price(in U.S.Dollars) : '+packing.price()); } } } //builder class for tablets order class TabBuilder { public TabType buildLenovoTab(){ TabType lenovo =new TabType(); lenovo.addItem(new Lenovo()); return lenovo; } public TabType buildMicroMaxTab(){ TabType mmx=new TabType(); mmx.addItem(new MicroMax()); return mmx; } } public class Main{ public static void main(String args()){ //build the tablets order and display the order TabBuilder tabBuilder=new TabBuilder(); TabType tabtype1=tabBuilder.buildLenovoTab(); tabtype1.showItems(); TabType tabtype2=tabBuilder.buildMicroMaxTab(); tabtype2.showItems(); } }
산출:
위의 예에서는 Lenovo와 Micromax의 두 태블릿 브랜드에 대한 완전한 태블릿 주문 시스템을 구축했습니다. 이들은 추상 클래스 회사에서 상속 된 concreteBuilder 클래스입니다. 그런 다음 두 태블릿 클래스의 주문을 작성하는 TabBuilder 클래스가 있습니다.
자주 묻는 질문
Q # 1) Java의 디자인 패턴은 무엇입니까? Java의 디자인 패턴 유형은 무엇입니까?
Windows에 appium을 설치하는 방법
대답: 디자인 패턴은 잘 테스트 된 솔루션을 개발하는 데 사용할 수있는 모범 사례입니다.
Java에는 세 가지 유형의 디자인 패턴이 있습니다.
- 창의적인 디자인 패턴 : 팩토리 패턴, 추상 팩토리 패턴, 싱글 톤 패턴, 빌더 패턴 및 프로토 타입 패턴은 창조 디자인 패턴의 예입니다. 이들은 주로 객체 생성과 관련이 있습니다.
- 구조적 디자인 패턴 : 주로 클래스 구조를 만드는 데 사용됩니다. 어댑터, 브리지 및 복합 패턴은 인기있는 구조 설계 패턴입니다.
- 행동 설계 패턴 : 이는 구현을 쉽게 확장 할 수있는 유연성과 함께 객체 간의 더 나은 상호 작용을 제공합니다. 관찰자 패턴, 전략 패턴 등은 행동 패턴의 몇 가지 예입니다.
Q # 2) 디자인 패턴이 사용되는 이유는 무엇입니까?
대답: 디자인 패턴은 복잡한 문제를 해결하는 데 사용할 수있는 검증되고 테스트 된 솔루션 모델을 제공합니다. 디자인 패턴을 통해 느슨한 결합으로 응집력있는 모듈을 만들 수 있습니다. 또한 디자인 패턴은 디자이너 간의 상호 작용을보다 효율적이고 효과적으로 만듭니다.
Q # 3) 패턴의 예는 무엇입니까?
대답: 자연 패턴의 예는 자연에서 발견되는 가시적 규칙 성입니다. 대칭, 나무, 파도, 거품, 줄무늬, 균열 등과 같은 자연 패턴은 자연 패턴의 몇 가지 예입니다.
Q # 4) MVC는 디자인 패턴입니까?
대답: 예, 데이터 모델, 프리젠 테이션 또는 뷰 레이어와 컨트롤러로 구성된 애플리케이션을 구축 할 수있는 일종의 디자인 패턴입니다. 아키텍처 패턴으로 더 분류 할 수 있습니다.
결론
이것으로 Java의 디자인 패턴에 대한 논의가 완료되었습니다. Java는 세 가지 유형의 디자인 패턴을 지원하지만. 창조, 구조 및 행동 패턴, 우리는 창조 디자인 패턴에 더 관심이 있습니다.
이 튜토리얼의 범위에 따라 크리에이티브 디자인 패턴의 세 가지 예, 즉 싱글 톤 패턴, 팩토리 패턴 및 빌더 패턴에 대해 논의했습니다.
Singleton 패턴은 가장 단순한 디자인 패턴이고 Factory 방식은 널리 사용되는 일반적인 디자인 패턴으로 가정합니다. 빌더 패턴은 복잡한 개체를 구성하는 데 사용되며 주로 복잡한 응용 프로그램을 개발하는 데 사용됩니다.
=> 여기에서 완벽한 Java 교육 가이드를 확인하십시오.
추천 도서
- 문자열 버퍼 및 문자열 작성기 자습서가있는 Java 문자열
- Java 배포 : Java JAR 파일 생성 및 실행
- Java 기초 : Java 구문, Java 클래스 및 핵심 Java 개념
- Java Virtual Machine : JVM이 Java 응용 프로그램을 실행하는 데 도움이되는 방법
- 초보자를위한 JAVA 튜토리얼 : 100 개 이상의 실습 Java 비디오 튜토리얼
- Java 정수 및 Java BigInteger 클래스 (예제 포함)
- Java 구성 요소 : Java 플랫폼, JDK, JRE 및 Java Virtual Machine
- 중요한 자바 키워드 목록-자바 예약어