[设计模式]

来源:互联网 发布:windows搭建ss教程 编辑:程序博客网 时间:2024/06/05 14:37

今天学习了设计模式中的建造者模式(Builder Pattern),这个模式也是属于四种设计模式中的创建型模式,四种模式如下所示:



建造者模式结构图如下:


在建造者模式中,我们需要用到四种角色:

1. Director:指挥者,根据用户需求来构建小人对象

2. Builder:建造者接口,用于创造Product各个部件指定的接口。内含建造Product的方法

3. ConcretedBuilder:实现Builder接口,用于构造和装配各个部件

4. Product:具体产品

总结构建者模式:将一个复杂对象的构建和他的表示分离,使得同样的构建过程可以创建不同的表示。

下面我们就以建造汽车的例子来示范一下建造者模式:


Car代码:

/** * Created by YanMing on 2017/5/20. */public class Car {    public String wheel;    public String body;    public String brand;    public void setCarWheel(String wheel){        this.wheel = wheel;    }    public void setCarBody(String body){        this.body = body;    }    public void setCarBrand(String brand){        this.brand = brand;    }    public void showMyCar(){        System.out.println("Brand: " + this.brand +"\n"+                            "Body: " + this.body +"\n" +                            "Wheel: " + this.wheel + "\n");    }}
Builer 接口:

/** * Created by YanMing on 2017/5/20. */public interface CarBuilder {    public void BuildeCarWheel();    public void BuildeCarBody();    public void BuildeCarBrand();    public Car FinishBuild();}
BenzBuilder 代码:(FordBuilder省略)

/** * Created by YanMing on 2017/5/20. */public class BenzBuilder implements CarBuilder {    Car benz = new Car();    @Override    public void BuildeCarWheel() {        System.out.println("Benz Wheel building!");        benz.setCarWheel("Benz Wheel");    }    @Override    public void BuildeCarBody() {        System.out.println("Benz Body building!");        benz.setCarBody("Benz Body");    }    @Override    public void BuildeCarBrand() {        System.out.println("Benz Brand building!");        benz.setCarBrand("Benz Brand");    }    @Override    public Car FinishBuild() {        return benz;    }}
Director代码:

/** * Created by YanMing on 2017/5/20. */public class CarDirector {    public void Construct(CarBuilder cb){        cb.BuildeCarBrand();        cb.BuildeCarBody();        cb.BuildeCarWheel();    }}

在主类中调用代码:

/** * Created by YanMing on 2017/5/20. */public class BuilderPattern {    public static void main(String arrgs []){        CarDirector director = new CarDirector();        BenzBuilder benzBuilder = new BenzBuilder();        FordBuilder fordBuilder = new FordBuilder();        director.Construct(benzBuilder);        Car benz = benzBuilder.FinishBuild();        benz.showMyCar();    }}
运行结果:



小思考:在我看来,建造者模式,每次只能返回一个对象。并且由于返回的对象和建造者模式是耦合的,如果我们想要多个Product对象,就必须实现Product类的Deep Copy。所以,我想能否将建造者函数内部的Product 改为传参,然后对引用对象进行加工呢?

就好像去饭店自带食材,因为厨师只有一份食材哈哈~

本文GitHub源码下载


P.S.文章不妥之处还望指正





原创粉丝点击