建造者模式
(1)关系图
(2)优点
1.将产品本身与产品创建过程进行解耦
2. 将复杂产品的创建步骤分解在不同的方法中,使得创建过程更加清晰
3. 增加新的具体建造者无需修改原有类库的代码,易于拓展,符合“开闭原则“
(3)缺点
1. 建造者模式所创建的产品一般具有较多的共同点,其组成部分相似;如果产品之间的差异性很大,则不适合使用建造者模式,因此其使用范围受到一定的限制
2. 如果产品的内部变化复杂,可能会导致需要定义很多具体建造者类来实现这种变化,导致系统变得很庞大
(4)代码
package Application;
import design.builder.Builder;
import design.builder.ConcreteBuilder;
import design.builder.Director;
import design.builder.Product;
public class Main {
static public void main(String [] args) throws Exception
{
//客户寻找到买电脑的人
//director是卖电脑的人
Director director = new Director();
//builder是装配电脑的人
Builder builder = new ConcreteBuilder();
//卖电脑的人让builder装配电脑
//builder里的电脑装配完毕
director.Construct(builder);
//获取电脑产品
Product computer = builder.GetComputer();
//展示电脑产品
computer.Show();
}
}
public class Director {
//指挥装机人员组装电脑
public void Construct(Builder builder){
builder. BuildCPU();
builder.BuildMainboard();
builder.BuildHD();
}
}
public abstract class Builder {
// 第一步:装CPU
// 声明为抽象方法,具体由子类实现
public abstract void BuildCPU();
// 第二步:装主板
// 声明为抽象方法,具体由子类实现
public abstract void BuildMainboard();
// 第三步:装硬盘
// 声明为抽象方法,具体由子类实现
public abstract void BuildHD();
// 返回产品的方法:获得组装好的电脑
public abstract Product GetComputer();
}
public class ConcreteBuilder extends Builder {
Product product = new Product();
@Override
public void BuildCPU() {
// TODO Auto-generated method stub
product.Add("组装CPU");
}
@Override
public void BuildMainboard() {
// TODO Auto-generated method stub
product.Add("组装主板");
}
@Override
public void BuildHD() {
// TODO Auto-generated method stub
product.Add("组装HD");
}
@Override
public Product GetComputer() {
// TODO Auto-generated method stub
return product;
}
}
public class Product {
//电脑组件的集合
private List<String> parts = new ArrayList<String>();
//用于将组件组装到电脑里
public void Add(String part){
parts.add(part);
}
public void Show(){
for (int i = 0;i<parts.size();i++){
System.out.println("组件"+parts.get(i)+"装好了");
}
System.out.println("电脑组装完成,请验收");
}
}