2019年5月13日 星期一

7天學會設計模式 CHAP17 建造者模式 Builder

7天學會設計模式
http://www.books.com.tw/products/0010750585

chap17.
建造者模式 Builder
目的:將一個由各種組件組合的複雜產品建造過程封裝
package com.ssc24.chap17.demo01;
public class Form {
 private String formName;
 public Form(String formName) {
  this.formName = formName;
 }
 public String toString() {
  return this.formName;
 }
}

package com.ssc24.chap17.demo01;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
public class Weapon {
 List<String> list = new ArrayList<String>();
 public Weapon(String[] weaponArray) {
  list.addAll(Arrays.asList(weaponArray));
 }
 public String toString() {
  return list.toString();
 }
}

package com.ssc24.chap17.demo01;
public abstract class IRobot {
 Form form;
 Power power;
 Weapon weapon;
 public void setForm(Form form) {
  this.form = form;
 }
 public void setPower(Power power) {
  this.power = power;
 }
 public void setWeapon(Weapon weapon) {
  this.weapon = weapon;
 }
 public void display() {
  System.out.println("機器人外型:" + form);
  System.out.println("機器人動力:" + power);
  System.out.println("機器人武器:" + weapon);
 }
}

package com.ssc24.chap17.demo01;
public class Gundam extends IRobot {
}

package com.ssc24.chap17.demo01;
public class Power {
 private String mainPower;
 private String subPower;
 private String battery;
 public Power(String mainPower,String subPower,String battery) {
  this.mainPower = mainPower;
  this.subPower = subPower;
  this.battery = battery;
 }
 public String toString() {
  return "{主動力:" + this.mainPower + " ,副動力:" + this.subPower + " ,電池:" + this.battery + "}";
 }
}

package com.ssc24.chap17.demo01;
public abstract class RobotBuilder {
 public abstract Form buildForm();
 public abstract Power buildPower();
 public abstract Weapon buildWeapon();
}

package com.ssc24.chap17.demo01;
public class GundamBuilder extends RobotBuilder {
 @Override
 public Form buildForm() {
  return new Form("鋼彈");
 }
 @Override
 public Power buildPower() {
  return new Power("亞哈反應爐", "Beta發電機", "氫電池");
 }
 @Override
 public Weapon buildWeapon() {
  return new Weapon(new String[]{
    "60nm 火神砲"
    ,"突擊長矛"
    ,"光束劍"
  });
 }
}

package com.ssc24.chap17.demo01;
public class Director {
 private RobotBuilder builder;
 public Director(RobotBuilder builder) {
  this.builder = builder;
 }
 public IRobot builderRobot() {
  IRobot robot = new Gundam();
  robot.setForm(builder.buildForm());
  robot.setPower(builder.buildPower());
  robot.setWeapon(builder.buildWeapon());
  return robot;
 }
}

package com.ssc24.chap17.demo01;
import static org.junit.Assert.*;
import org.junit.Test;
public class RobotBuilderTest {
 @Test
 public void test() {
  System.out.println("===建構者模式測試===");
  Director director = new Director(new GundamBuilder());
  IRobot robot = director.builderRobot();
  robot.display();
 }
}

/**
===建構者模式測試===
機器人外型:鋼彈
機器人動力:{主動力:亞哈反應爐 ,副動力:Beta發電機 ,電池:氫電池}
機器人武器:[60nm 火神砲, 突擊長矛, 光束劍]
**/