小知识,大挑战!本文正在参与“程序员必备小知识”创作活动。
现在汽车品牌都很多,但是对于汽车这个产品来说,其建造过程都是很清晰的,要有轮胎,车架,发动机,座椅等固定构成,但具体建造过程不同品牌的车都是不一样的,对于用户来说,我不管你怎么创建的,用户只想说我要买兰博基尼,我不差钱给我来一辆。
如果我们需要将一个复杂对象的创建与表示分离,使得相同的创建过程可以创建出不同的表示时,我们就需要一个设计模式,建造者模式。如果我们用了建造者模式,用户就只需指定需要的建造类型就可以得到这个产品,而具体的建造过程和细节就不需要知道了。
创建者模式主要由创建者,具体创建者,指挥者,具体产品构成,首先用一个UML类图来展现这几者的关系:
-
Builder就是创建者,是为创建一个产品对象各模块指定的抽象类。
-
ProductActualBuilder就是具体的创建者,继承Builder抽象类,构造和装配各个部件
-
Product就是具体的产品
-
Director是指挥者,用来根据用户需求构建对象。
现在有两种汽车品牌,一种是奇瑞,一种是蔚来汽车,我们就根据创建者的构建模型进行具体实例创建
# 汽车类
public class Car {
private String tread;//轮胎
private String engine;//发动机
private String chairs;//座位
private String light;//灯
public String getTread() {return tread; }
public void setTread(String tread) { this.tread = tread;}
public String getEngine() {return engine; }
public void setEngine(String engine) { this.engine = engine;}
public String getChairs() {return chairs;}
public void setChairs(String chairs) { this.chairs = chairs;}
public String getLight() { return light; }
public void setLight(String light) {this.light = light;}
#抽象创建类
public interface CarBuilder {
public void buildeTread();
public void buildeEngine();
public void buildeChairs();
public void buildelight();
public Car makeCar();
}
#具体创建类
#蔚来汽车
public class FutureBuilder implements CarBuilder {
Car car = new Car();
@Override
public void buildeTread() {car.setLight("蔚来轮胎"); }
@Override
public void buildeEngine() {car.setEngine("蔚来发动机");}
@Override
public void buildeChairs() {car.setChairs("蔚来汽车座位");}
@Override
public void buildelight() {car.setLight("蔚来灯");}
@Override
public Car makeCar() { return car;}
}
#奇瑞汽车
public class QiRuiBuilder implements CarBuilder {
Car car=new Car();
@Override
public void buildeTread() {car.setTread("奇瑞轮胎");}
@Override
public void buildeEngine() {car.setEngine("奇瑞发动机");}
@Override
public void buildeChairs() { car.setChairs("奇瑞座椅");}
@Override
public void buildelight() {car.setLight("奇瑞大灯"); }
@Override
public Car makeCar() {return car;}
}
#指挥者
public class Commander {
CarBuilder carBuilder;
public Car getCar(CarBuilder carBuilder) {
carBuilder.buildeChairs();
carBuilder.buildeEngine();
carBuilder.buildelight();
carBuilder.buildeTread();
return carBuilder.makeCar();
}
}
#测试类
public class CarTest {
public static void main(String[] args) {
Commander commander = new Commander();
Car car = commander.getCar(new FutureBuilder());
System.out.println(car.getChairs());
}
}
上面实例是建造者模式的常规用法,指挥者在创建者模式起到很重要的作用,它用于指导具体构建者如何构建产品,控制调用先后次序,并向调用者返回完整的产品类。
建造者模式它主要用于创建一些复杂的对象,这些对象内部构建间的建造顺序通常是稳定的,但对象内部的构建通常面临着复杂的变化。使用建造者的好处就是将建造代码和表示代码进行了分离建造者模式将产品具体建造过程进行了隐藏,所以如果改变一个产品的内部表示,只需要再定义一个具体的建造者就可以了,有利于系统的扩展。建造者模式所创建的产品一般具有较多的共同点,其组成部分相似;如果产品之间的差异性很大,则不适合使用建造者模式,因此其使用范围受到一定的限制。
建造者模式与 工厂模式相比较而言,建造者模式返回一个组装好的完整产品,而抽象工厂模式返回一系列相关的产品,我们可以把工厂模式比作是汽车各个部件的生产工厂,负责生产汽车所需的各个部件,而建造者模式就是一个汽车组装工厂,将各个部件组装成一个完整的汽车。