빌더 모드
정의를 발전기 패턴이라고도합니다. 복잡한 객체 (추상 범주)의 구성 프로세스를 추상화 할 수 있으므로이 추상 프로세스의 다른 구현 방법이 다른 증상 (속성)을 갖는 객체를 구성 할 수 있습니다.
복잡한 객체를 생성하기위한 알고리즘이 해당 객체의 구성 요소와 무관 해야하는 경우, 구성 프로세스는 구성된 객체가 다른 표현을 갖도록 허용해야합니다. 빌더 모드 사용을 고려할 수 있습니다.
성취하다
1. Builder 제품 객체를 생성하는 각 구성 요소에 대한 추상 인터페이스를 지정합니다. 일반적으로 제품을 생성하고 반환하는 추상적 인 방법이 포함되어 있거나 구체적인 방법이 될 수 있으며 생성 과정을 콘크리트 빌더 클래스에 넣습니다.
2. ConcreteBuilder는 제품의 다양한 구성 요소를 구성하고 조립하기 위해 Builder 인터페이스를 구현합니다.
3. 디렉터는 제품을 구성하기 위해 적절한 빌더에게 전화 할 책임이 있습니다. 감독 수업은 일반적으로 제품 클래스에 의존하지 않습니다. 빌더 클래스는 감독 클래스와 직접 상호 작용합니다.
4. 제품은 구성 할 복잡한 물체를 나타냅니다. ConcreateBuilder는 제품의 내부 표현을 생성하고 조립 프로세스를 정의합니다.
/ ** "제품"*/ 클래스 피자 {private String Dough = ""; 개인 문자열 소스 = ""; 개인 문자열 topping = ""; 공개 void setDough (String Dough) {this.dough = 반죽; } public void setSauce (String Sauce) {this.sauce = 소스; } public void settopping (String topping) {this.topping = 토핑; }} ''/** "Abstract Builder"*/''Abstract Class PizzAbuilder {보호 된 피자 피자; 공개 피자 getpizza () {리턴 피자; } public void createnewpizzaproduct () {pizza = new Pizza (); } 공개 초록 void builddough (); 공개 초록 void buildSauce (); 공개 초록 void buildTopping (); } / ** "ConcreteBuilder"* / Class HawaiianPizzabuilder 확장 PizzAbuilder {public void builddough () {pizza.setdough ( "cross"); } public void buildSauce () {pizza.setsauce ( "Mild"); } public void buildTopping () {pizza.setTopping ( "ham+파인애플"); }} / ** "ConcreteBuilder"* / Class SpicyPizzabuilder 확장 PizzAbuilder {public void builddough () {pizza.setdough ( "팬 구운"); } public void buildSauce () {pizza.setsauce ( "hot"); } public void buildTopping () {pizza.setTopping ( "Pepperoni+salami"); }} ''/** "Director"*/''클래스 웨이터 {Private PizzAbuilder PizzAbuilder; 공개 void setPizzAbuilder (pizzAbuilder pb) {pizzabuilder = pb; } public pizza getPizza () {return pizzabuilder.getPizza (); } public void constructPizza () {pizzAbuilder.createnewPizzAproduct (); pizzabuilder.builddough (); pizzabuilder.buildsauce (); pizzabuilder.buildtopping (); }} /** 피자를 주문하는 고객. */ class builderexample {public static void main (String [] args) {웨이터 웨이터 = New Waiter (); PizzAbuilder Hawaiian_PizzAbuilder = New HawaiianPizzabuilder (); pizzabuilder spicy_pizzabuilder = 새로운 spicypizzabuilder (); 웨이터 .SetPizzAbuilder (Hawaiian_PizzAbuilder); 웨이터 .constructPizza (); 피자 피자 = 웨이터.getPizza (); }}클라이언트는 감독 객체를 생성하고 원하는 빌더 객체로 구성합니다. 이사는 고객의 제품 생성 요청을 얻고 마침내 제품을 얻습니다.
이점
1. 객체를 구성하는 과정은 다른 제품 객체를 생산하기 위해 신중하게 제어 할 수 있습니다.
2. 확장하기 쉬운. 신제품이 있으면 새로운 콘크리트 빌더를 추가하여 달성 할 수 있습니다.
관련 패턴 추상 공장 패턴은 복잡한 객체를 만들 수 있기 때문에 발전기와 유사합니다. 주요 차이점은 발전기 패턴이 복잡한 물체를 단계별로 구성하는 데 중점을 둡니다. 추상 공장 모델은 여러 시리즈 제품 객체 (단순하거나 복잡한)에 중점을 둡니다.
발전기는 마지막 단계에서 제품을 반환하고 추상 공장의 경우 제품이 즉시 반환됩니다.
프로토 타입 모드
프로토 타입 패턴을 정의하는 것은 생성 패턴의 유형이며, 새 인스턴스를 작성하는 대신 새 인스턴스를 반환하기 위해 기존 인스턴스를 "복사"하는 것이 특징입니다. 복사 된 예제는 우리가 "프로토 타입"이라고 부르는 것입니다.
프로토 타입 모드는 주로 복잡하거나 시간이 많이 걸리는 인스턴스를 작성하는 데 사용됩니다.이 경우 기존 인스턴스를 복사하면 프로그램이보다 효율적으로 실행되기 때문입니다. 또는 동일한 값을 생성하고 다른 유사한 데이터의 이름을 지정합니다.
성취하다
1. 클라이언트 - 새 개체를 만들고 복제를 통해 다른 객체를 얻습니다.
2. 프로토 타입 - 클론 자체의 추상 방법을 정의하십시오.
3. ConcretePrototype- 클론 방법을 구현하십시오.
공개 인터페이스 프로토 타입 {public Abstract Object Clone (); } public class concreteprototype 구현 프로토 타입 {public object clone () {return super.clone (); }} public class client {public static void main (String arg []) {ConcretePrototype obj1 = new ConcretePrototype (); Concreteprototype obj2 = ConcretePrototype) obj1.clone (); }} 예
1. 게임의 많은 요소가 반복되며 프로토 타입 모드를 사용하여 동일한 요소를 복사 할 수 있습니다.
2. 데이터 차트를 만들 때 처음으로 데이터베이스에서 데이터를 읽고 객체에 저장해야합니다. 동일한 데이터의 다른 차트를 만들어야 할 때 프로토 타입 모드를 사용하면 데이터베이스를 다시 읽지 못할 수 있습니다.
관련 질문 및 구현
1. 생성 할 프로토 타입의 수가 고정되지 않은 경우 프로토 타입 관리자를 만들 수 있습니다. 프로토 타입 객체를 복사하기 전에 클라이언트는 먼저 프로토 타입 관리자의 조건을 충족하는 프로토 타입 객체가 있는지 확인합니다. 있으면 직접 사용합니다. 그렇지 않다면, 하나를 복제하십시오. 이를 프로토 타입 모드의 등록 형태라고합니다.
2. 복사에는 두 가지 유형이 있습니다 : 딥 카피와 얕은 사본. 복사 할 때 복사 객체와 프로토 타입 객체는 객체의 모든 내부 변수를 공유하며 두 객체는 메모리 공간과 수명주기와 동일합니다. 프로토 타입 객체의 수정은 또한 복제본을 수정하고 그 반대도 마찬가지입니다.
Java에서는 복제 가능한 인터페이스를 구현하는 한 객체 클래스의 클론 메소드를 호출하여 얕은 복사를 달성 할 수 있습니다.
공공 계급 얕은 클론은 복제 가능한 {int age; 사람; 공공 무효 설정 (int Age) {this.age = age; } public void setperson (문자열 이름) {person = new Person (이름); } public Object Clone ()는 ClonenOntSupportedException을 던집니다. {// 기본 Java는 얕은 사본 return super.clone ()을 구현합니다. }} 공개 클래스 사람 {문자열 이름; 공개 사람 (문자열 이름) {this.name = 이름; }} public class test {public static void main (String [] args)은 clonenotsupportedException {shallowclone oldshallowclone = new shallowclone (); OldshallowClone.setage (20); Oldshallowclone.setperson ( "Eric"); System.out.println ( "OldName :" + OldshallowClone.person.name + "age :" + OldshallowClone.age); 얕은 클론 NewShallowClone = (얕은 클론) OldshallowClone.clone (); System.out.println ( "NewName :" + NewShallowClone.person.name + "Age :" + NewshallowClone.age); oldshallowclone.age = 30; OldshallowClone.person.name = "Frank"; System.out.println ( "NewName :" + NewShallowClone.person.name + "Age :" + NewshallowClone.age); }} 산출:
Oldname : Eric Age : 20Newname : Eric Age : 20 Newname : Frank Age : 20
물체의 복사는 물체에 대한 참조임을 알 수 있습니다. 객체의 값이 변경되면 복사 된 객체도 변경되며 기본 유형의 Java는 복사 값입니다.
아래에서 우리는 딥 카피를 구현합니다.
공개 클래스 딥 클론 {int age; 사람; 공공 무효 설정 (int Age) {this.age = age; } public void setperson (문자열 이름) {person = new Person (이름); } public DeepClone (DeepClone DeepClone) {this.age = deepclone.age; 이 .person = 새로운 사람 (DeepClone.person.name); } public deepclone () {} public object clone ()는 clonenotsupportedException {return new DeepClone (this); }} public class test {public static void main (String [] args)은 clonenotsupportedException {DeepClone OldDeepClone = new DeepClone (); Olddeepclone.setage (20); OldDeepClone.SetPerson ( "Eric"); System.out.println ( "OldName :" + OldDeepClone.person.name + "Age :" + OldDeepClone.age); DeepClone NewDeepClone = (DeepClone) OldDeepClone.clone (); System.out.println ( "NewName :" + newDeepClone.person.name + "age :" + newdeepclone.age); olddeepclone.age = 30; OldDeepClone.person.name = "Frank"; System.out.println ( "NewName :" + newDeepClone.person.name + "age :" + newdeepclone.age); }} 산출:
Oldname : Eric Age : 20Newname : Eric Age : 20 Newname : Eric Age : 20
위의 사본 방법에서, 우리는 객체를 재현하고 딥 카피 구현에 대한 참조를 재현했습니다.
이점
1. 복사는 새로운 것보다 낫습니다.
2. 개체 생성의 세부 사항을 단순화하거나 숨기고 직접 복사하십시오.