抽象工厂模式 | 建造者模式 | |
---|---|---|
类图 |
抽象工厂模式生产汽车
ICar
package com.peng.pk_cxgc;
/**
* @author kungfu~peng
* @data 2017年12月9日
* @description
*/
public interface ICar {
// 汽车生产商--名牌
public String getBand();
//汽车的型号
public String getModel();
}
AbsBMW
package com.peng.pk_cxgc;
/**
* @author kungfu~peng
* @data 2017年12月9日
* @description
*/
public abstract class AbsBMW implements ICar {
private final static String BMW_BAND = "宝马汽车";
@Override
public String getBand() {
return BMW_BAND;
}
@Override
public abstract String getModel();
}
AbsBenz
package com.peng.pk_cxgc;
/**
* @author kungfu~peng
* @data 2017年12月9日
* @description
*/
public abstract class AbsBenz implements ICar {
private final static String BENZ_BAND = "奔驰汽车";
@Override
public String getBand() {
return BENZ_BAND;
}
@Override
public abstract String getModel();
}
BMWSuv
package com.peng.pk_cxgc;
/**
* @author kungfu~peng
* @data 2017年12月9日
* @description 宝马商务车
*/
public class BMWSuv extends AbsBMW {
private final static String X_SEARIES = "X系列车型SUV";
@Override
public String getModel() {
return X_SEARIES;
}
}
BMWVan
package com.peng.pk_cxgc;
/**
* @author kungfu~peng
* @data 2017年12月9日
* @description 宝马商务车
*/
public class BMWVan extends AbsBMW {
private final static String SEVENT_SEARIES = "7系列车型商务车";
@Override
public String getModel() {
return SEVENT_SEARIES;
}
}
BenzSuv
package com.peng.pk_cxgc;
/**
* @author kungfu~peng
* @data 2017年12月9日
* @description 宝马商务车
*/
public class BenzSuv extends AbsBMW {
private final static String G_SEARIES = "G系列车型SUV";
@Override
public String getModel() {
return G_SEARIES;
}
}
BenzVan
package com.peng.pk_cxgc;
/**
* @author kungfu~peng
* @data 2017年12月9日
* @description 宝马商务车
*/
public class BenzVan extends AbsBMW {
private final static String R_SEARIES = "R系列车型商务车";
@Override
public String getModel() {
return R_SEARIES;
}
}
CarFactory
package com.peng.pk_cxgc;
/**
* @author kungfu~peng
* @data 2017年12月9日
* @description
*/
public interface CarFactory {
// 生产SUV
public ICar createSuv();
// 生产Van
public ICar createVan();
}
BMWFactory
package com.peng.pk_cxgc;
/**
* @author kungfu~peng
* @data 2017年12月9日
* @description
*/
public class BMWFactory implements CarFactory {
@Override
public ICar createSuv() {
return new BMWSuv();
}
@Override
public ICar createVan() {
return new BMWVan();
}
}
BenzFactoy
package com.peng.pk_cxgc;
/**
* @author kungfu~peng
* @data 2017年12月9日
* @description
*/
public class BenzFactory implements CarFactory {
@Override
public ICar createSuv() {
return new BenzSuv();
}
@Override
public ICar createVan() {
return new BenzVan();
}
}
Client
package com.peng.pk_cxgc;
/**
* @author kungfu~peng
* @data 2017年12月9日
* @description
*/
public class Client {
public static void main(String[] args) {
CarFactory factory = null;
factory = new BenzFactory();
System.out.println("=========生产一辆奔驰SUV=========");
System.out.println(factory.createSuv().getModel());
System.out.println("=========生产一辆奔驰Van=========");
System.out.println(factory.createVan().getModel());
factory = new BMWFactory();
System.out.println("=========生产一辆宝马SUV=========");
System.out.println(factory.createSuv().getModel());
System.out.println("=========生产一辆宝马Van=========");
System.out.println(factory.createVan().getModel());
}
}
执行结果
=========生产一辆奔驰SUV=========
G系列车型SUV
=========生产一辆奔驰Van=========
R系列车型商务车
=========生产一辆宝马SUV=========
X系列车型SUV
=========生产一辆宝马Van=========
7系列车型商务车
建造者模式生产汽车
ICar
package com.peng.pk_jz2;
/**
* @author kungfu~peng
* @data 2017年12月9日
* @description
*/
public interface ICar {
// 汽车车轮
public String getWheel();
// 汽车引擎
public String getEngine();
}
Car
package com.peng.pk_jz2;
/**
* @author kungfu~peng
* @data 2017年12月9日
* @description
*/
public class Car implements ICar {
// 汽车车轮
private String wheel;
// 汽车引擎
private String engine;
// 构造函数传递参数
public Car(String wheel, String engine) {
super();
this.wheel = wheel;
this.engine = engine;
}
@Override
public String getWheel() {
return this.wheel;
}
@Override
public String getEngine() {
return this.engine;
}
@Override
public String toString() {
return "车的轮子是:" + this.wheel + ",车的引擎是:" + this.engine;
}
}
CarBuilder
package com.peng.pk_jz2;
/**
* @author kungfu~peng
* @data 2017年12月9日
* @description
*/
public abstract class CarBuilder {
// 设计蓝图
private BluePaint bp;
public Car buildCar() {
return new Car(buildEngine(), buildWhel());
}
protected abstract String buildWhel();
protected abstract String buildEngine();
// 接收一份设计蓝图
public void receiveBluepaint(BluePaint bp) {
this.bp = bp;
}
// 获得设计蓝图--真正的建造者才能查看蓝图
public BluePaint getBp() {
return bp;
}
}
BenzBuilder
package com.peng.pk_jz2;
/**
* @author kungfu~peng
* @data 2017年12月9日
* @description
*/
public class BenzBuilder extends CarBuilder {
@Override
protected String buildWhel() {
return super.getBp().getWheel();
}
@Override
protected String buildEngine() {
return super.getBp().getEngine();
}
}
BMWBuilder
package com.peng.pk_jz2;
/**
* @author kungfu~peng
* @data 2017年12月9日
* @description
*/
public class BMWBuilder extends CarBuilder {
@Override
protected String buildWhel() {
return super.getBp().getWheel();
}
@Override
protected String buildEngine() {
return super.getBp().getEngine();
}
}
BulePaint
package com.peng.pk_jz2;
/**
* @author kungfu~peng
* @data 2017年12月9日
* @description
*/
public class BluePaint {
// 车轮的生产要求
private String wheel;
// 引擎的生产要求
private String engine;
public String getWheel() {
return wheel;
}
public void setWheel(String wheel) {
this.wheel = wheel;
}
public String getEngine() {
return engine;
}
public void setEngine(String engine) {
this.engine = engine;
}
}
Director
package com.peng.pk_jz2;
/**
* @author kungfu~peng
* @data 2017年12月9日
* @description
*/
public class Director {
// 声明对建造者的引用
private CarBuilder benzBuilder = new BenzBuilder();
private CarBuilder bmwBuilder = new BMWBuilder();
// 生产奔驰SUV
public ICar createBenzSuv() {
// 制造出汽车
return createCar(benzBuilder, "奔驰的轮胎", "奔驰的引擎");
}
// 生产宝马商务车
public ICar createBMWVan() {
return createCar(bmwBuilder, "宝马车的轮胎", "宝马车的引擎");
}
// 生产出混合车型
public ICar createComplexCar() {
return createCar(bmwBuilder, "宝马的轮胎", "奔驰的引擎");
}
// 生产车辆
private ICar createCar(CarBuilder cb, String wheel, String engine) {
// 导演怀揣设计蓝图
BluePaint bp = new BluePaint();
bp.setEngine(engine);
bp.setWheel(wheel);
System.out.println("获得生产蓝图!");
cb.receiveBluepaint(bp);
return cb.buildCar();
}
}
Client
package com.peng.pk_jz2;
/**
* @author kungfu~peng
* @data 2017年12月9日
* @description
*/
public class Client {
public static void main(String[] args) {
// 定义出导演类
Director director = new Director();
// 生产一辆奔驰SUV
System.out.println("======生产奔驰SUV=====");
System.out.println(director.createBenzSuv());
// 生产一辆宝马商务
System.out.println("======生产宝马商务=====");
System.out.println(director.createBMWVan());
// 生产一辆混合车型
System.out.println("======生产混合车型=====");
System.out.println(director.createComplexCar());
}
}
执行结果
======生产奔驰SUV=====
获得生产蓝图!
车的轮子是:奔驰的引擎,车的引擎是:奔驰的轮胎
======生产宝马商务=====
获得生产蓝图!
车的轮子是:宝马车的引擎,车的引擎是:宝马车的轮胎
======生产混合车型=====
获得生产蓝图!
车的轮子是:奔驰的引擎,车的引擎是:宝马的轮胎
抽象共产模式生产汽车 | 建造者模式生产汽车 |
---|---|
抽象共产模式把一辆车认为是一个完整、不可拆分的对象。它注重完整性,一个产品一旦找到一个工厂生产,那就是固定的型号,不会出现一个生产宝马的工厂生产出来奔驰车的情况 | 按照建造者设计模式设计一个生产车辆需要把车辆进行拆分,拆分成引擎和轮胎(暂且有这两个部件),然后由建造者进行建造,想要什么车,只要有设计蓝图即可,马上就可以建造出相应的车出来。它注重的是对零件的装配、组合、封装,他从一个构件装配角度看待一个对象 |
工厂 | 车间 | |
---|---|---|
观察的角度 | 更高层次去看对象的构建,对一个领导者来说,不用关心一个工厂到底是怎样具体的生产一个产品的 | 它是由车间组成,不同的车间完成不同的任务,一个完整的汽车需要引擎车间和轮胎车间的配合才能完成,他们的配合的基础就是汽车的设计蓝图,而蓝图掌握在车间主任(导演)的手上,建造者模式更关心的是建造的过程 |
尺度大小 | 尺度大:它关注产品的整体 | 尺度小:它关注构建过程 |
应用场景 | 屏蔽对象的创建过程,只提供一个封装良好的对象 | 可以用在装配方面 |