您的位置:首页 > 编程语言 > Java开发

java设计模式3--建造者模式

2018-02-25 17:12 344 查看
 需求:  现有某种产品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 Compute
4000
r_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;
}
}
测试类:使用junitpublic 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");
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: