有四個名詞需了解
Builder:為創建具體產品的具體建造者提供介面
ConcreteBuilder:建造具體產品
Director:呼叫 Builder 介面來創建產品物件
Product:具體產品(此例為模板模式的程式碼)
創建兩個抽象類別(builder類別和product類別),並讓子類實作,其中builder和product產生關聯
最後 Director 放 builder
※
public abstract class AbstractTemplate {
public enum EnumMethods {
m1, m2, m3;
}
private List<EnumMethods> list = new ArrayList<>();
public void setList(List<EnumMethods> list) {
this.list = list;
}
protected abstract void method1();
protected abstract void method2();
protected abstract void method3();
public void builderMethod() {
for (EnumMethods em : list) {
switch (em) {
case m1:
this.method1();
break;
case m2:
this.method2();
break;
case m3:
this.method3();
break;
}
}
}
}
--------------------
public class Concrete1 extends AbstractTemplate {
@Override
protected void method1() {
System.out.println("Concrete1 m1");
}
@Override
protected void method2() {
System.out.println("Concrete1 m2");
}
@Override
protected void method3() {
System.out.println("Concrete1 m3");
}
}
--------------------
public class Concrete2 extends AbstractTemplate {
@Override
protected void method1() {
System.out.println("Concrete2 m1");
}
@Override
protected void method2() {
System.out.println("Concrete2 m2");
}
@Override
protected void method3() {
System.out.println("Concrete2 m3");
}
}
※
※測試
List<EnumMethods> list1 = new ArrayList<>(); list1.add(EnumMethods.m2); list1.add(EnumMethods.m1); list1.add(EnumMethods.m3); List<EnumMethods> list2 = new ArrayList<>(); list2.add(EnumMethods.m3); list2.add(EnumMethods.m2); list2.add(EnumMethods.m1); AbstractTemplate c1 = new Concrete1(); c1.setList(list1); c1.builderMethod(); System.out.println(); AbstractTemplate c2 = new Concrete2(); c2.setList(list2); c2.builderMethod();
※結果:
Concrete1 m2
Concrete1 m1
Concrete1 m3
Concrete2 m3
Concrete2 m2
Concrete2 m1
加上Builder
※public abstract class AbstractBuilder {
public abstract void setList(List<EnumMethods> list);
public abstract AbstractTemplate getAbstractTemplate();
}
--------------------
public class Concrete1Builder extends AbstractBuilder {
private Concrete1 c1 = new Concrete1();
@Override
public void setList(List<EnumMethods> list) {
c1.setList(list);
}
@Override
public AbstractTemplate getAbstractTemplate() {
return c1;
}
}
--------------------
public class Concrete2Builder extends AbstractBuilder {
private Concrete2 c2 = new Concrete2();
@Override
public void setList(List<EnumMethods> list) {
c2.setList(list);
}
@Override
public AbstractTemplate getAbstractTemplate() {
return c2;
}
}
※
※測試
List<EnumMethods> list1 = new ArrayList<>(); list1.add(EnumMethods.m2); list1.add(EnumMethods.m1); list1.add(EnumMethods.m3); List<EnumMethods> list2 = new ArrayList<>(); list2.add(EnumMethods.m3); list2.add(EnumMethods.m2); list2.add(EnumMethods.m1); AbstractBuilder c1 = new Concrete1Builder(); c1.setList(list1); AbstractTemplate at1 = c1.getAbstractTemplate(); at1.builderMethod(); System.out.println(); AbstractBuilder c2 = new Concrete1Builder(); c2.setList(list2); AbstractTemplate at2 = c2.getAbstractTemplate(); at2.builderMethod();
※結果一樣
加上Director
※public class Director {
private List<EnumMethods> list1 = new ArrayList<>();
private List<EnumMethods> list2 = new ArrayList<>();
Concrete1Builder c1 = new Concrete1Builder();
Concrete2Builder c2 = new Concrete2Builder();
public void setList1(List<EnumMethods> list1) {
this.list1 = list1;
}
public void setList2(List<EnumMethods> list2) {
this.list2 = list2;
}
public Concrete1 getConcrete1() {
c1.setList(list1);
return (Concrete1) c1.getAbstractTemplate();
}
public Concrete2 getConcrete2() {
c2.setList(list2);
return (Concrete2) c2.getAbstractTemplate();
}
}
※
※測試
List<EnumMethods> list1 = new ArrayList<>(); list1.add(EnumMethods.m2); list1.add(EnumMethods.m1); list1.add(EnumMethods.m3); List<EnumMethods> list2 = new ArrayList<>(); list2.add(EnumMethods.m3); list2.add(EnumMethods.m2); list2.add(EnumMethods.m1); Director dir = new Director(); dir.setList1(list1); dir.setList2(list2); dir.getConcrete1().builderMethod(); System.out.println(); dir.getConcrete2().builderMethod();
※結果一樣
沒有留言:
張貼留言