生成器模式:将一个复杂的对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示。生成器模式的主要思想是抽象出创建对象的步骤,使得这些步骤的不同实现可以创建不同的对象表示。
现在汽车公司有一个完整的创建模式,再为其他土豪创建汽车时只需要把他的想法告诉建造队让工程师作指导就ok了!这个过程演示的就是生成器模式!
创建:
某汽车公司推出了某营销方案让土豪去参与创建自己独特的汽车,为了方便把汽车分成了底盘、车身、发动机和车轮四个部分,汽车如下:
public class Car {
//汽车类
private String fram; // 车子的外壳
private String chassis; // 车子的底盘
private String engine; // 车子的引擎
private String wheels; // 车子的轮胎
public String getFram() {
return fram;
}
public void setFram(String fram) {
this.fram = fram;
}
public String getChassis() {
return chassis;
}
public void setChassis(String chassis) {
this.chassis = chassis;
}
public String getEngine() {
return engine;
}
public void setEngine(String engine) {
this.engine = engine;
}
public String getWheels() {
return wheels;
}
public void setWheels(String wheels) {
this.wheels = wheels;
}
@Override
public String toString() {
return "Car [fram=" + fram + ", chassis=" + chassis + ", engine="
+ engine + ", wheels=" + wheels + "]";
}
}
假如你是一个土豪,现在想拥有一辆自己参与设计的汽车,当然你是不会这样自己创建汽车的!
public class Client {
public static void main(String[] args) {
Car car = new Car(); //自己创建汽车
car.setChassis("私家车式底盘"); //设计汽车的地盘
car.setEngine("私家车式引擎"); //设计汽车的引擎
car.setFram("私家车式车型"); //设计汽车的车身
car.setWheels("私家车式轮胎"); //设计车轮
System.out.println(car); //查看创建出来的汽车
}
}
//结果:Car [fram=私家车式车型, chassis=私家车式底盘, engine=私家车式引擎, wheels=私家车式轮胎]
这种创建方式是让你自己来造出汽车来,所以你只能跟汽车公司派出的建造队说出你的想法,让汽车建造队帮你创造你想要的汽车!
public interface CarBuilder {
//汽车建造队的信息
public void makeFram(); //建造车身
public void makeChassis(); //建造底盘
public void makeEngine(); //建造引擎
public void makeWheels(); //建造车轮
public Car getCar(); //组装成型
}
这是告诉你建造队的规模信息,先让你了解下创建汽车的流程,接着你把自己想建造BM汽车的设想告诉汽车公司,然后下面是汽车公司实际派出的汽车建造队。
//实际的汽车建造队:BM汽车建造队
public class BMCarBuilder implements CarBuilder{
private Car car = new Car();
public void makeFram() {
car.setFram("BM式车型"); //你设想的车型
}
public void makeChassis() {
car.setChassis("BM式底盘"); //你设想的地盘
}
public void makeEngine() {
car.setEngine("BM式引擎"); //你设想的引擎
}
public void makeWheels() {
car.setWheels("BM式车轮"); //你设想的车轮
}
public Car getCar() {
return car; //组装你设想的车
}
}
下面来创建你的BM汽车:
public class Client {
public static void main(String[] args) {
//组建BM汽车建造队
CarBuilder cb = new BMCarBuilder();
cb.makeChassis(); //制作地盘
cb.makeEngine(); //制作引擎
cb.makeFram(); //制作车身
cb.makeWheels(); //制作车轮
Car car = cb.getCar(); //组装汽车
System.out.println(car); //查看创建出来的汽车
}
}
//结果:Car [fram=BM式车型, chassis=BM式底盘, engine=BM式引擎, wheels=BM式车轮]
//汽车工程师 其实扮演者导演的角色 来指导汽车工程队
public class CarDirector {
private CarBuilder cb = null;
//确定具体的汽车建造队
public CarDirector(CarBuilder cb) {
this.cb = cb;
}
//指导汽车制造和组装的流程
public void makeCar(){
cb.makeChassis();
cb.makeEngine();
cb.makeFram();
cb.makeWheels();
}
}
现在你可以轻松安全的等待自己的汽车被创造出来:
public class Client {
public static void main(String[] args) {
//组建BM汽车建造队
CarBuilder cb = new BMCarBuilder();
//专门的汽车工程师 来指导BM汽车建造队
CarDirector cd = new CarDirector(cb);//这里也可以用成员函数来设置CarBuilder
cd.makeCar(); //指导汽车的制造
car = cb.getCar();//得到建造好的汽车
System.out.println(car);//查看创建出来的汽车
}
}
//结果:Car [fram=BM式车型, chassis=BM式底盘, engine=BM式引擎, wheels=BM式车轮]
现在汽车公司有一个完整的创建模式,再为其他土豪创建汽车时只需要把他的想法告诉建造队让工程师作指导就ok了!这个过程演示的就是生成器模式!
如再创建BC车:
//BC车的建造队
public class BCCarBuilder implements CarBuilder{
private Car car = new Car();
public void makeFram() {
car.setFram("BC式车型");
}
public void makeChassis() {
car.setChassis("BC式底盘");
}
public void makeEngine() {
car.setEngine("BC式引擎");
}
public void makeWheels() {
car.setWheels("BC式车轮");
}
public Car getCar() {
return car;
}
}
创建:
public class Client {
public static void main(String[] args) {
//组建BC汽车建造队
CarBuilder cb = new BCCarBuilder();
//专门的汽车工程师
CarDirector cd = new CarDirector(cb);
cd.makeCar(); //指导汽车的制造
car = cb.getCar();//得到建造好的汽车
System.out.println(car);//查看创建出来的汽车
}
}
//结果:Car [fram=BC式车型, chassis=BC式底盘, engine=BC式引擎, wheels=BC式车轮]
生成器的UML类图
生成器模式的使用场景:
1、要创建的对象构造十分复杂
2、需要将对象的构造过程独立出来,不同的构建过程能产生不同的对象表现
生成器模式的优点:
1、生产器模式让用户可以变化它创建产品的内部表达形式,它也隐藏了产品怎么样被创建出来的。
2、每个具体的生产器都独立于程序的其他生成器,因此改善了程序的模板化,并且使添加其他生产器变得相对简单。
3、由于每个生成器根据数据逐渐构建最终的产品,用户对生成器构建的最终产品有更多的控制。
生成器模式与工厂模式的比较:
相同点:
1、二者都是创建类型的模式。
2、二者都创建并且返回了产品的对象。
不同点:
生成器模式注重按步骤创建一个复杂的对象,一步一步的建立起该对象,最后组合对象最后返回对象,而工厂模式(或抽象工厂)是强调一次性的返回某个对象。