概念:建造者模式使用多个简单的对象一步一步构建成一个复杂的对象,这种类型属于创建型模式,它提供了一种创建对象的最佳方法。
主要解决:通常有各个部分的的子对象用一定的算法构成;由于需求的变化,这个复杂的对象的各个部分经常面临剧烈的变化,但是他们组合在一起的算法相对稳定。
1.创建一个表示食物条目的接口
public interface Item{
public String name();
public Packing packing();
public float price();
}
Packing.java
public interface Packing{
public String pack();
}
2.创建实现Packing接口的实体类
Wrapper.java
public class Wrapper implements Packing{
public String pack(){
return "Wrapper";
}
}
Bottle.java
public class Bottle implements Packing{
public String pack(){ return "Bottle";}
}
3.创建实现Item接口的抽象类,该类听默认的功能
public abstract class Burger implements Item{
public Packing packing(){
return new Wrapper();}
public abstract float price();
}
public abstarc class ColdDrink implements Item{
public Packing packing(){
return new Bottle();
}
public abstract float price();
}
4.创建扩展了Burgerd和coldeDrink的实体类
public class VegBurger extends Burge{
public float price(){}
string name(){}
}
public class Coke extends ColdDrink{
public float price(){
return 30.0f;
}
public String name(){
return "coke";
}
}
5.创建一个mel类,带有上面定义的Item对象
public class Meal{
private List<Item> items=new ArrayList<Item>();
public void addItem(Item item){
items.add(item);
}
float getCost(){
float cost=0.0f;
for(Item item:items){
cost+=item.price();
}
return cost;
}
public void showTtems(){
for(Item item:items){}
}
}
建造者模式:是将一个复杂的对象的构建与它的表示分离,使同样的构建过程可以创建不同的表示
1.builder:给出一个抽象接口,以规范产品对象的各个组成成分的建造,实现复杂对象的那些不法的创建,不涉及具体的对象部件的创建
2.ConcreteBuilder:实现Builder接口,针对不同的商业逻辑,具体的复杂对象的各部分的创建,在建造过程完成户,提供产品的实例。
3.Director:调用具体建造则来创建复杂对象的各个部分,不涉及具体产品的信息,只负责保证对象个部分完整创建或按某顺序创建
4.Product创建的复杂对象
class Product{
vector<string> parts;
public:
void Add(const string part){
parts.push_back(part);
}
void show() const{
for(int i=0;i<parts.size();i++){
cout<<parts[i]<<endl;
}
}
}
//抽象builder对象
class Builder{
public:
virtul void BuildHead()=0;
virtul void buildbody()=0;
....
}
class FatPersonBuilder:public Builder{
private:
}
class ThinPersonBuilder:public Builder
class Director{
void Construct(Builder builder){
builder.buildHead();
builder.buildBody();
builder.BuildHand();
builder.BuildFeet();
}
}