设计模式篇04-建造者模式

1.关系类图

设计模式篇04-建造者模式_第1张图片

2.建造者模式介绍

定义:指将一个复杂的对象的构造与它表示分离,使同样构建过程不同的表示,这样的设计模式被称为建造者模式.它是将一个复杂的对象分解为多个简单的对象,然后一步一步构建而成的.它将变与不变相分离,即产品的组成部分是不变的,但每一部分是可以灵活选择的.

优点:
	1)封装性好,构建与组成部分必须相同,其限制了使用范围.
	2)扩展性好,各个具体建造者相互独立,有利于系统的解耦
	3)客户端不必知道产品组成细节,建造者可以创建过程逐渐细化,而不对其他模块产生任何影响,便于控制	细节风险
	
缺点:
	1)产品组成部分必须相同,这限制了其使用范围
	2)如果产品内部变化复杂,内部发生变化,则建造者需要同步修改,后期维护成本比较大

建造者模式与工厂模式的关注点不同:建造者模式注重零部件的组装过程,而过程方法模式各部分注重零部件的创建过程

3.代码实现

//产品:客厅
public class Parlour {

    private String wall;    //墙
    private String TV;    //电视
    private String sofa;    //沙发 

    public void setWall(String wall) {
        this.wall = wall;
    }

    public void setTV(String TV) {
        this.TV = TV;
    }

    public void setSofa(String sofa) {
        this.sofa = sofa;
    }

    @Override
    public String toString() {
        return "Parlour{" +
                "wall='" + wall + '\'' +
                ", TV='" + TV + '\'' +
                ", sofa='" + sofa + '\'' +
                '}';
    }
}

//抽象建造者
public abstract class Decorator {
    //创建产品对象
    protected Parlour product = new Parlour();
    public abstract void buildWall();
    public abstract void buildTV();
    public abstract void buildSofa();

    //返回产品对象
    public Parlour getResult() {
        return product;
    }

}

//具体建造者
public class ConcreteDecorator extends Decorator {
    public void buildWall() {
        product.setWall("w1");
    }
    public void buildTV() {
        product.setTV("TV1");
    }
    public void buildSofa() {
        product.setSofa("sf1");
    }

}

//指挥者:项目经理
public class ProjectManager {
    private Decorator builder;
    public ProjectManager(Decorator builder) {
        this.builder = builder;
    }
    //产品构建与组装方法

    public Parlour decorate() {
        builder.buildWall();
        builder.buildTV();
        builder.buildSofa();
        return builder.getResult();
    }
}


//客户端
  public static void main(String[] args) {
        Decorator decorator=new ConcreteDecorator();
        ProjectManager projectManager = new ProjectManager(decorator);
        Parlour parlour = projectManager.decorate();
        System.out.println(parlour);
    }

你可能感兴趣的:(设计模式)