需求: 现有某种产品P,它有很多子系列产品P1,P2,P3.....,每个子产品都有不同的操作生产工序
怎么获取到所需的子产品呢?
-- new P1(), new P2(), new P3()....... ?
--使用工厂方法:一个产品对应一个子工厂,再来一个调度者(String name){if "p1" -->newF1().getP1().... }
可是工厂方法只负责=>生产原始产品, 还需要别的操作来继续加工, 怎么办? 改造子工厂加入工序 f1(), f2() ?
那么要加工进来的配件呢?工厂直接new 配件?这样一来,工厂也脱离了本意,所以有一种“ 建造者模式 ”, 使用了工人的角色代替工厂, 解决产品需要加工的问题。
在eclipse 上开发:
第一级目录: 产品抽象类+ 接口加工 + 工人调度者+ 配件父类(普通类)
//抽象产品类: public class Computer { //定义属性:产品名称 private String name; //电脑的众多配件 private List<Units> units=new ArrayList<>(); public Computer(){} public Computer(String name){this.name=name;} public String toString(){ String mess="{"; for(int i=0;i<units.size();i++){ mess+=units.get(i).getName(); if(i!=units.size()-1){ mess+=","; }else{ mess+="}"; } } return name+mess; } //省略set,get.....
//定义加工接口:工作标准--创建半成品,精加工,出货 public interface Builder { Computer makeBasePc(); void addUnits(Units u); Computer getProductPc(); }
//承包商:管理所有建造者, 使得建造者完成工作,产出货物---各种电脑 public class Manager { //属性:一个被管理的工人 private Builder builder; //构造器:赋值初始化 public Manager (Builder b){ this.builder=b; } //调度:工人工作--->获得产品 public Computer makeComputer(List<Units> list){ builder.makeBasePc(); for(Units u: list){ builder.addUnits(u); } return builder.getProductPc(); } }
//配件父类 public class Units { //属性:定义该部件名称 private String name; public Units(){} public Units(String name){ this.name=name;} public String getName() { return name; } public void setName(String name) { this.name = name; } }
第二级目录:具体产品类+ 具体配件类+ 具体单技能工人类
//具体子产品 public class Computer_Acer extends Computer{ public Computer_Acer(){} public Computer_Acer(String name){super(name);} } public class Computer_Apple extends Computer{ public Computer_Apple(){} public Computer_Apple(String name){super(name);} } public class Computer_Dell extends Computer{ public Computer_Dell(){} public Computer_Dell(String name){super(name);} }
//组件之 cpu public class Units_cpu extends Units { public Units_cpu(){} public Units_cpu(String name) { super(name+"cpu");} } //组件之 硬盘 public class Units_disk extends Units { public Units_disk(){} public Units_disk(String name) { super(name+"disk");} } //组件之 缓存条 public class Units_ram extends Units { public Units_ram(){} public Units_ram(String name) { super(name+"ram"); } }
//建造者1:专门负责制造Acer pc public class Builder_AcerPc implements Builder { //属性:产品 Computer_Acer pc; @Override public Computer makeBasePc() {//创造半成品 pc=new Computer_Acer("Acer pc"); return pc; } @Override public void addUnits(Units u) { pc.getUnits().add(u);//往电脑里加入一个组件 System.out.println(pc.getName()+" 加入"+u.getName()); } @Override public Computer getProductPc() { return pc;//返回出货产品 } } //建造者2:专门负责制造Apple pc public class Builder_ApplePc implements Builder { //属性:产品 Computer_Apple pc; @Override public Computer makeBasePc() {//创造半成品 pc=new Computer_Apple("Apple pc"); return pc; } @Override public void addUnits(Units u) {//往电脑里加入一个组件 pc.getUnits().add(u); System.out.println(pc.getName()+"--加入--"+u.getName()); } @Override public Computer getProductPc() {//返回出货产品 return pc; } } //建造者3:专门负责制造Apple pc public class Builder_DellPc implements Builder{ //属性:产品 Computer_Dell pc; @Override public Computer makeBasePc() {//创造半成品 pc=new Computer_Dell("Dell pc"); return pc; } @Override public void addUnits(Units u) {//往电脑里加入一个组件 pc.getUnits().add(u); System.out.println(pc.getName()+"--加入--"+u.getName()); } @Override public Computer getProductPc() {//返回出货产品 return pc; } }
测试类:使用junit
public class BuilderModeTest extends TestCase { //属性:组件--原材料 List<Units> units=Arrays.asList(new Units[] { new Units_disk("材料1"),new Units_ram("材料2"),new Units_cpu("材料3")}); Manager manager; //======================开始junit测试=================== public static void main(String[] args) { junit.textui.TestRunner.run(BuilderModeTest.class); } //======定义:各个测试方法======= //创建一个管理者,给一个工人 public void testAcerPc( ){ manager=new Manager(new Builder_AcerPc());//传一个Acer工人 Computer pc=manager.makeComputer(units); //得到Acer pc System.out.println(pc+"\n"); } public void testApplePc( ){ manager=new BussinessManager(new Builder_ApplePc());//传一个Apple工人 Computer pc=manager.makeComputer(units); //得到Apple pc System.out.println(pc+"\n"); } public void testDellPc( ){ manager=new BussinessManager(new Builder_DellPc());//传一个Dell工人 Computer pc=manager.makeComputer(units); //得到Dell pc System.out.println(pc+"\n"); } }