이 기사는 Java 디자인 패턴(코드 예제)의 빌더 패턴 및 프로토타입 패턴에 대한 소개를 제공합니다. 필요한 친구가 참고할 수 있기를 바랍니다.
머리말
이전 글에서는 팩토리 패턴에 대해 알아보고 간단한 팩토리 패턴, 팩토리 메소드, 추상 팩토리 패턴을 소개했습니다. 본 글에서는 디자인 패턴 중 창의적인 패턴인 빌더 패턴과 프로토타입 패턴을 소개합니다.
빌더 모드
소개
빌더 모드는 창의적인 모드입니다. 빌더 패턴은 여러 개의 단순 객체를 사용하여 복잡한 객체를 단계별로 구축합니다. 이러한 유형의 디자인 패턴은 객체를 생성하는 최적의 방법을 제공하는 생성 패턴입니다.
간단히 말하면 복잡한 것을 추출하여 외부 세계에 간단한 호출을 제공하는 것이며, 이는 동일한 구축 과정에서 다양한 표현을 생성할 수 있습니다. 공장 모드와 매우 유사하지만 구성 요소 조립에 더 많은 관심을 기울입니다.
다음은 설명을 위한 예입니다.
우리가 매일 먹는 음식에는 부침개, 도시락, 라면, 두유, 우유, 주스가 있습니다. 식사는 아침, 점심, 저녁 세 끼로 나누어집니다. 식사는 주로 음식(밥)과 음료(두유, 주스 등)로 이루어지며, 아침 식사로 팬케이크와 두유를 먹고 도시락도 먹을 수 있습니다. 그리고 주스를 점심으로 먹기 때문에 아침과 점심으로 무엇을 먹어야 할지 정확히 알 수 있습니다.
먼저 음식과 음료라는 두 가지 속성으로 음식 카테고리를 정의합니다.
class Meal{ private String food; private String drinks; public String getFood() { return food; } public void setFood(String food) { this.food = food; } public String getDrinks() { return drinks; } public void setDrinks(String drinks) { this.drinks = drinks; } }
음식을 정의할 때 음식에 대한 표준 인터페이스를 정의하는 것입니다. 실제로 음식을 먹고 마시는 것을 의미합니다.
interface IBuilderFood{ void buildFood(); void buildDrinks(); Meal createMeal(); }
음식 인터페이스는 먹고 마시는 구성 요소를 정의한 다음 createMeal() 메서드를 통해 필요한 음식을 반환합니다.
이제 아침과 점심을 정의할 수 있습니다.
코드 예:
class Breakfast implements IBuilderFood{ Meal meal; public Breakfast(){ meal=new Meal(); } @Override public void buildFood() { meal.setFood("煎饼"); } @Override public void buildDrinks() { meal.setDrinks("豆浆"); } @Override public Meal createMeal() { return meal; } } class Lunch implements IBuilderFood{ Meal meal; public Lunch(){ meal=new Meal(); } @Override public void buildFood() { meal.setFood("盒饭"); } @Override public void buildDrinks() { meal.setDrinks("果汁"); } @Override public Meal createMeal() { return meal; } }
정의하면 아침 식사와 점심 식사를 만드는 과정이 완료됩니다. 하지만 이것은 빌더 모드가 아닙니다. 복잡한 객체의 일부를 생성하거나, 부품을 완전히 생성하거나, 특정 규칙에 따라 생성하는 데 사용되는 핵심 디렉터가 있습니다. 이제 식사를 만들기 위한 Director를 만들 수 있습니다. 어떤 식사가 만들어지는지는 알 필요가 없으며 호출하는 사람이 결정합니다.
여기서 레스토랑을 정의하고 식사를 만들 수 있습니다. 고객이 어떤 식사를 만들 것인지 결정합니다.
코드 예:
class FoodStore{ public Meal createBreakfast(IBuilderFood bf){ bf.buildDrinks(); bf.buildFood(); return bf.createMeal(); } }
이 Director를 생성한 후 통화 테스트를 해보겠습니다.
코드 예:
public class BuilderTest { public static void main(String[] args) { FoodStore foodStore=new FoodStore(); Meal meal=foodStore.createBreakfast(new Breakfast()); Meal meal2=foodStore.createBreakfast(new Lunch()); System.out.println("小明早上吃的是:"+meal.getFood()+",喝的饮料是:"+meal.getDrinks()); System.out.println("小明中午吃的是:"+meal2.getFood()+",喝的饮料是:"+meal2.getDrinks()); } }
출력 결과:
小明早上吃的是:煎饼,喝的饮料是:豆浆 小明中午吃的是:盒饭,喝的饮料是:果汁
는 빌더 모드의 작동 원리를 간략하게 소개합니다. 이는 다음 4가지로 요약할 수 있습니다.
Builder: 추상 인터페이스를 지정하고, 이 제품에 필요한 구성 요소 생성에는 특정 개체 구성 요소 생성이 포함되지 않습니다.
ConcreteBuilder: Builder 인터페이스를 구현하고, 다양한 로직에 대해 다양한 메소드를 생성하고, 최종적으로 제품의 인스턴스를 제공하는 것이 필요합니다.
디렉터: 복잡한 개체의 일부를 만드는 데 사용됩니다. 이 부분을 완전히 만들거나 특정 규칙에 따라 만듭니다.
제품: 구성된 복합 개체를 나타냅니다.
사용 시나리오:
일부 기본 구성 요소가 불편할 때 적용 가능하지만 조합이 자주 변경됩니다. 예를 들어, 슈퍼마켓 판촉 선물 패키지입니다.
장점:
빌더 독립적이며 확장이 쉽습니다.
상세한 리스크 관리가 용이합니다.
단점
내부 구조가 복잡하고 이해하기 쉽지 않습니다.
제품에는 직접적인 공통점이 있어야 하며 범위는 통제되어야 합니다.
프로토타입 패턴
프로토타입 패턴은 성능을 보장하면서 반복되는 개체를 만드는 데 사용됩니다. 이러한 유형의 디자인 패턴은 객체를 생성하는 최적의 방법을 제공하는 생성 패턴입니다.
일반적으로 객체를 생성할 때는 직접 생성하지만 객체 생성 비용이 높을 경우 반복적인 2차 생성은 비용 효율적이지 않습니다.
예를 들어, 우리는 축제 기간 동안 모두 이메일을 보냈고, 이러한 축복은 이름을 제외하면 대부분 동일합니다. 현재 이 모드를 사용하여 그에 따라 생성할 수 있습니다.
다음은 설명하기 위한 간단한 예입니다.
샤오밍과 샤오홍의 생일이 같은 날이라 축하 메일을 보내야 하는데, 게을러서 이름 빼고는 축복의 말이 똑같네요. 이때 먼저 축복문 작성을 완료한 다음 축복문을 복제하고 마지막으로 다른 이름으로 보낼 수 있습니다. 하지만 여기서는 간단하게 설명하겠습니다. 인쇄해 보세요.
코드 예:
public class PrototypeTest { public static void main(String[] args) { Mail mail=new Mail(); mail.setMsg("生日快乐!"); Mail mail2=(Mail) mail.clone(); mail.setName("小明"); mail2.setName("小红"); System.out.println(mail.toString()); System.out.println(mail2.toString()); } } class Mail implements Cloneable { private String name; private String msg; public String getName() { return name; } public void setName(String name) { this.name = name; } public String getMsg() { return msg; } public void setMsg(String msg) { this.msg = msg; } public Object clone() { Object clone = null; try { clone = super.clone(); } catch (CloneNotSupportedException e) { e.printStackTrace(); } return clone; } @Override public String toString() { return name + ":" + msg ; } }
출력 결과:
小明:生日快乐! 小红:生日快乐!
看完原型模式的创建,是不是感觉就是和Java中克隆即为类似呢?
实际上它的核心也就是克隆。
克隆有两种,浅克隆和深克隆,本文主要介绍的是浅克隆。
浅克隆:
在浅克隆中,如果原型对象的成员变量是值类型,将复制一份给克隆对象;如果原型对象的成员变量是引用类型,则将引用对象的地址复制一份给克隆对象,也就是说原型对象和克隆对象的成员变量指向相同的内存地址。
简单来说,在浅克隆中,当对象被复制时只复制它本身和其中包含的值类型的成员变量,而引用类型的成员对象并没有复制。
实现Cloneable接口并重写Object类中的clone()方法;
深克隆:
在深克隆中,无论原型对象的成员变量是值类型还是引用类型,都将复制一份给克隆对象,深克隆将原型对象的所有引用对象也复制一份给克隆对象。
简单来说,在深克隆中,除了对象本身被复制外,对象所包含的所有成员变量也将复制。
实现Serializable接口,通过对象的序列化和反序列化实现克隆,可以实现真正的深度克隆。
使用场景:
类初始化的时候需要消耗大量资源的时候;
获取数据库连接繁琐的时候;
一个对象,有很多个修改者的时候;
优点:
1.可以提升性能;
缺点:
1.因为必须实现Cloneable 接口,所以用起来可能不太方便。
相关推荐:
위 내용은 Java 디자인 패턴의 빌더 패턴 및 프로토타입 패턴 소개(코드 예)의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

클래스 로더는 통합 클래스 파일 형식, 동적로드, 부모 위임 모델 및 플랫폼 독립적 인 바이트 코드를 통해 다른 플랫폼에서 Java 프로그램의 일관성과 호환성을 보장하고 플랫폼 독립성을 달성합니다.

Java 컴파일러가 생성 한 코드는 플랫폼 독립적이지만 궁극적으로 실행되는 코드는 플랫폼 별입니다. 1. Java 소스 코드는 플랫폼 독립적 인 바이트 코드로 컴파일됩니다. 2. JVM은 바이트 코드를 특정 플랫폼의 기계 코드로 변환하여 크로스 플랫폼 작동을 보장하지만 성능이 다를 수 있습니다.

멀티 스레딩은 프로그램 대응 성과 리소스 활용을 향상시키고 복잡한 동시 작업을 처리 할 수 있기 때문에 현대 프로그래밍에서 중요합니다. JVM은 스레드 매핑, 스케줄링 메커니즘 및 동기화 잠금 메커니즘을 통해 다양한 운영 체제에서 멀티 스레드의 일관성과 효율성을 보장합니다.

Java의 플랫폼 독립성은 작성된 코드가 수정없이 JVM이 설치된 모든 플랫폼에서 실행될 수 있음을 의미합니다. 1) Java 소스 코드는 바이트 코드로 컴파일됩니다. 2) 바이트 코드는 JVM에 의해 해석되고 실행됩니다.

javaapplicationscanindeedencounterplatform-specificissuesdespitetejvm'sabstraction.ressistinclude : 1) nativecodeandlibraries, 2) OperatingSystemDifferences, 3) jvmimplementationvariations, 및 4) 어려운 의존성, 개발자, 1)

클라우드 컴퓨팅은 Java의 플랫폼 독립성을 크게 향상시킵니다. 1) Java Code는 바이트 코드로 컴파일되어 다른 운영 체제에서 JVM에 의해 실행되어 크로스 플랫폼 작동을 보장합니다. 2) Docker 및 Kubernetes를 사용하여 Java 응용 프로그램을 배포하여 휴대 성 및 확장 성을 향상시킵니다.

Java'SplatformIndencealLowsDeveloperstowStowRiteCodeOntOnitOniNanyDeviceOroswithajvm. ThisIsachieAdthroughCompilingTobyTecode, thejvMIngretSorcompileStruntime.thistureatureDificallyNatlyBoostedjava'SADOPTIONDUOCROSS-PLAT-PLAT-PLAT-PLAT-PLAT-PLAT-PLAT-PLAT-PPLATION

Docker와 같은 컨테이너화 기술은 Java의 플랫폼 독립성을 대체하기보다는 향상됩니다. 1) 환경 간 일관성을 보장, 2) 특정 JVM 버전을 포함한 종속성 관리, 3) 배포 프로세스를 단순화하여 Java 응용 프로그램을보다 적응 가능하고 관리 할 수 있도록합니다.


핫 AI 도구

Undresser.AI Undress
사실적인 누드 사진을 만들기 위한 AI 기반 앱

AI Clothes Remover
사진에서 옷을 제거하는 온라인 AI 도구입니다.

Undress AI Tool
무료로 이미지를 벗다

Clothoff.io
AI 옷 제거제

Video Face Swap
완전히 무료인 AI 얼굴 교환 도구를 사용하여 모든 비디오의 얼굴을 쉽게 바꾸세요!

인기 기사

뜨거운 도구

SublimeText3 Linux 새 버전
SublimeText3 Linux 최신 버전

Atom Editor Mac 버전 다운로드
가장 인기 있는 오픈 소스 편집기

SecList
SecLists는 최고의 보안 테스터의 동반자입니다. 보안 평가 시 자주 사용되는 다양한 유형의 목록을 한 곳에 모아 놓은 것입니다. SecLists는 보안 테스터에게 필요할 수 있는 모든 목록을 편리하게 제공하여 보안 테스트를 더욱 효율적이고 생산적으로 만드는 데 도움이 됩니다. 목록 유형에는 사용자 이름, 비밀번호, URL, 퍼징 페이로드, 민감한 데이터 패턴, 웹 셸 등이 포함됩니다. 테스터는 이 저장소를 새로운 테스트 시스템으로 간단히 가져올 수 있으며 필요한 모든 유형의 목록에 액세스할 수 있습니다.

SublimeText3 중국어 버전
중국어 버전, 사용하기 매우 쉽습니다.

SublimeText3 Mac 버전
신 수준의 코드 편집 소프트웨어(SublimeText3)
