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

 需求:  现有某种产品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");
	}
}



猜你喜欢

转载自blog.csdn.net/eyeofeagle/article/details/79369537
今日推荐