java-設計模式-生成器
生成器模式Bulider
使你能够分步骤创建复杂对象。 该模式允许你使用相同的创建代码生成不同类型和形式的对象。
将一个复杂对象的构造与它的表示分离,使同样的构建过程可以创建不同的表示。
将一个复杂的对象分解为多个简单的对象,然后一步一步构建而成。它将变与不变相分离,
即产品的组成部分是不变的,但每一部分是可以灵活选择的。
優點:
各个具体的建造者相互独立,有利于系统的扩展。
客户端不必知道产品内部组成的细节,便于控制细节风险。
缺點:
产品的组成部分必须相同,这限制了其使用范围。
如果产品的内部变化复杂,该模式会增加很多的建造者类。
生成器模式和工厂模式的关注点不同:建造者模式注重零部件的组装过程,而工廠方法模式更注重零部件的创建过程
生成器模式結構;
产品角色(Product):它是包含多个组成部件的复杂对象,由具体建造者来创建其各个滅部件。
抽象建造者(Builder):它是一个包含创建产品各个子部件的抽象方法的接口,通常还包含一个返回
复杂产品的方法 getResult()。
具体建造者(Concrete Builder):实现 Builder 接口,完成复杂产品的各个部件的具体创建方法。
指挥者(Director):它调用建造者对象中的部件构造与装配方法完成复杂对象的创建,在指挥者中不涉及具体产品的信息
簡單的例子
思考如何创建一个 房屋
House对象。
你需要建造四面墙和地板, 安装房门和一套窗户, 然后再建造一个屋顶。 但是如果你想要
一栋更宽敞更明亮的房屋, 还要有院子和其他设施 (例如暖气、 排水和供电设备), 那又该怎么办呢?
最簡單的方法擴展house基類
解決:
将对象构造代码从产品类中抽取出来, 并将其放在一个名为生成器的独立对象中。
例子:分佈製造車子:
車子的屬性
/**
* 車子的特徵1
*/
public class Engine {
private final double volume;
private double mileage;
private boolean started; public Engine(double volume,double mileage){
this.volume = volume;
this.mileage = mileage;
} public void on(){
started = true;
} public void off(){
started = false;
} public boolean isStarted(){
return started;
} private void go(double mileage){
if (started){
this.mileage += mileage;
}else {
System.out.println("not go ,you must engine first");
} } public double getVolume() {
return volume;
} public double getMileage() {
return mileage;
}
}
*
* 車子特徵2:
*/
public class GPSNavigator {
private String route; public GPSNavigator() {
this.route = "221b, Baker Street, London to Scotland Yard, 8-10 Broadway, London";
} public GPSNavigator(String manualRoute) {
this.route = manualRoute;
} public String getRoute() {
return route;
}
}
/**
* 車子的特徵3
* 擋位類型
*/
public enum Thransmission {
SINGLE_SPEED,MANUAL,AUTOMATIC,SEMI_AUTOMATIC
}
/**
* 車子的特徵4
*
*/
public class TripComputer {
private Car car; public void setCar(Car car) {
this.car = car;
} public void showFuelLevel(){
System.out.println("Fuel level:"+car.getFuel());
} public void showStatus(){
if (this.car.getEngine().isStarted()){
System.out.println("car started");
}else{
System.out.println("car isn't started");
}
}
}
/**
* 汽車的類型枚舉類
*/
public enum Type {
CICY_CAR,SPORTS_CAR,SUV
}
車子類
public class Car {
private final Type type;
private final int seats;
private final Engine engine;
private final Thransmission thransmission;
private final TripComputer tripComputer;
private final GPSNavigator gpsNavigator;
private double fuel = 0; public Car(Type type, int seats, Engine engine, Thransmission thransmission, TripComputer tripComputer, GPSNavigator gpsNavigator) {
this.type = type;
this.seats = seats;
this.engine = engine;
this.thransmission = thransmission;
this.tripComputer = tripComputer;
this.gpsNavigator = gpsNavigator;
} public Type getType() {
return type;
} public int getSeats() {
return seats;
} public Engine getEngine() {
return engine;
} public Thransmission getThransmission() {
return thransmission;
} public TripComputer getTripComputer() {
return tripComputer;
} public GPSNavigator getGpsNavigator() {
return gpsNavigator;
} public double getFuel() {
return fuel;
} public void setFuel(double fuel) {
this.fuel = fuel;
} }
生成器:設置車子的屬性。實現接口完成車子創建和手冊創建
public interface Builder {
void setType(Type type);//汽車的類型
void setSeats(int seats);
void setEngine(Engine engine);
void setThransmission(Thransmission thransmission);
void setTripComputer(TripComputer tripComputor);
void setGPSNavigator(GPSNavigator gpsNavigator); }
車子創建:
public class CarBuilder implements Builder{ private Type type;
private int seats;
private Engine engine;
private Thransmission thransmission;
private TripComputer tripComputer;
private GPSNavigator gpsNavigator; public void setType(Type type) {
this.type = type;
} public void setSeats(int seats) {
this.seats = seats;
} public void setEngine(Engine engine) {
this.engine = engine;
} public void setThransmission(Thransmission thransmission) {
this.thransmission = thransmission;
} public void setTripComputer(TripComputer tripComputor) {
this.tripComputer = tripComputor;
} public void setGPSNavigator(GPSNavigator gpsNavigator) {
this.gpsNavigator = gpsNavigator;
} /*
獲取Car的方法
*/
public Car getResult(){
return new Car(type,seats,engine,thransmission,tripComputer,gpsNavigator);
}
}
手冊類:
public class Manual {
private final Type type;
private final int seats;
private final Engine engine;
private final Thransmission thransmission;
private final TripComputer tripComputer;
private final GPSNavigator gpsNavigator;
private double fuel = 0; public Manual(Type type, int seats, Engine engine, Thransmission thransmission, TripComputer tripComputer, GPSNavigator gpsNavigator) {
this.type = type;
this.seats = seats;
this.engine = engine;
this.thransmission = thransmission;
this.tripComputer = tripComputer;
this.gpsNavigator = gpsNavigator;
} public String print(){
String info = "";
info += "Type of car: " + type + "\n";
info += "Count of seats: " + seats + "\n";
info += "Engine: volume - " + engine.getVolume() + "; mileage - " + engine.getMileage() + "\n";
info += "Transmission: " + thransmission + "\n";
if (this.tripComputer != null) {
info += "Trip Computer: Functional" + "\n";
} else {
info += "Trip Computer: N/A" + "\n";
}
if (this.gpsNavigator != null) {
info += "GPS Navigator: Functional" + "\n";
} else {
info += "GPS Navigator: N/A" + "\n";
}
return info;
}
}
手冊生成器:
public class CarManualBuilder implements Builder {
private Type type;
private int seats;
private Engine engine;
private Thransmission thransmission;
private TripComputer tripComputer;
private GPSNavigator gpsNavigator; public void setType(Type type) {
this.type = type;
} public void setSeats(int seats) {
this.seats = seats;
} public void setEngine(Engine engine) {
this.engine = engine;
} public void setThransmission(Thransmission thransmission) {
this.thransmission = thransmission;
} public void setTripComputer(TripComputer tripComputor) {
this.tripComputer = tripComputor;
} public void setGPSNavigator(GPSNavigator gpsNavigator) {
this.gpsNavigator = gpsNavigator;
} /*
獲取Car手冊的方法
*/
public Manual getResult(){
return new Manual(type,seats,engine,thransmission,tripComputer,gpsNavigator);
}
}
建立控制生成器的累:詳單與server
public class Director {
/**
* sportCar
* @param builder
*/
public void constructSportsCar(Builder builder){
builder.setType(Type.SPORTS_CAR);
builder.setSeats(2);
builder.setEngine(new Engine(3.0, 0));
builder.setThransmission(Thransmission.SEMI_AUTOMATIC);
builder.setTripComputer(new TripComputer());
builder.setGPSNavigator(new GPSNavigator());
} /**
*city Car
* @param builder
*/
public void constructCityCar(Builder builder){
builder.setType(Type.CICY_CAR);
builder.setSeats(2);
builder.setEngine(new Engine(1.2, 0));
builder.setThransmission(Thransmission.SEMI_AUTOMATIC);
builder.setTripComputer(new TripComputer());
builder.setGPSNavigator(new GPSNavigator());
} /**
*SUV Car
* @param builder
*/
public void constructSUVCar(Builder builder){
builder.setType(Type.SUV);
builder.setSeats(4);
builder.setEngine(new Engine(2.5, 0));
builder.setThransmission(Thransmission.MANUAL);
builder.setTripComputer(new TripComputer());
builder.setGPSNavigator(new GPSNavigator());
}
}
客戶端測試
public class TestClient {
public static void main(String[] args) {
Director director = new Director(); CarBuilder builder = new CarBuilder();
director.constructCityCar(builder); Car car = builder.getResult();
System.out.println("Car Type"+car.getType()); CarManualBuilder carManualBuilder = new CarManualBuilder();
director.constructCityCar(carManualBuilder);
Manual manual = carManualBuilder.getResult();
System.out.println("manual+ " +manual.print());
}
}
java-設計模式-生成器的更多相关文章
- java-設計模式概述
什麽是設計模式?? 软件设计中常见问题的典型解决方案. 能根据需求进行调整的预制蓝图, 可用于解决代码中反复出现的设计问题. 模式并不是一段特定的代码, 而是解决特定问题的一般性概念. 你可以根据模式 ...
- java-設計模式-單例模式
單例模式 一种创建型设计模式, 让你能够保证一个类只有一个实例, 并提供一个访问该实例的全局节点. 一个类只有一个实例,且该类能自行创建这个实例的一种模式. 簡單的對比就是: 例如,Windows 中 ...
- 高效率dc升壓轉換器 應用技巧談 功率設計
為便攜式電子設備開發電源電路要求設計工程師通過最大程度地提高功率和降低整個系統的功耗來延長電池使用壽命,這推動器件本身的尺寸變得更小,從而有益于在設計終端產品時獲得更高靈活性.這種設計的最重要元器件之 ...
- [實現DDD] 第10章 聚合(1)設計原則
聚合只是將一些實體(Entity)與值對象(Value Object)聚集起來的對象樹嗎?? 有些途徑可能使我們設計出不正確的聚合模型, 如:可能為了對象組合上的方便而將聚合設計的很大;也可能設計的聚 ...
- Java设计模式——组合模式
JAVA 设计模式 组合模式 用途 组合模式 (Component) 将对象组合成树形结构以表示“部分-整体”的层次结构.组合模式使得用户对单个对象和组合对象的使用具有唯一性. 组合模式是一种结构型模 ...
- [Xamarin] 使用LayoutInflater.Inflate載入預先設計好的Layout並使用 (转帖)
開發的時候,一定會把一些東西設計成元件,並且可以多次使用,今天紀錄一篇比較簡單的方法,可以載入事先做好的Layout 並且給予事件 介紹一下範例: Main.axml: <?xml versio ...
- java装饰者模式理解
java 装饰者模式其实就是扩展子类的功能,和继承是一个性质. 但继承是在编译时就固定扩展了父类的一些功能,而装饰者模式是在运行过程中动态绑定对象,实现一个子类可以随时扩展功能. 将方法排列组合,也可 ...
- !!转!!java 简单工厂模式
举两个例子以快速明白Java中的简单工厂模式: 女娲抟土造人话说:“天地开辟,未有人民,女娲抟土为人.”女娲需要用土造出一个个的人,但在女娲造出人之前,人的概念只存在于女娲的思想里面.女娲造人,这就是 ...
- java 双重检查模式
java 双重检查模式 在并发环境下 兼顾安全和效率 成例(Idiom)是一种代码层次上的模式,是在比设计模式的层次更具体的层次上的代码技巧.成例往往与编程语言密切相关.双重检查成例(Double C ...
随机推荐
- vivo全球商城全球化演进之路——多语言解决方案
一.背景 随着经济全球化的深入,许多中国品牌纷纷开始在海外市场开疆扩土.实现全球化意味着你的产品或者应用需要能够在全球各地的语言环境使用,我们在进行海外业务的推进时,需要面对的最大挑战就是多语言问题. ...
- CobaltStrike逆向学习系列(10):TeamServer 启动流程分析
这是[信安成长计划]的第 10 篇文章 关注微信公众号[信安成长计划] 0x00 目录 0x01 基本校验与解析 0x02 初始化 0x03 启动 Listeners 在之前的分析中,都是针对 Cob ...
- Win10 装好 Hyper-V 又要将其卸载方法记录
现需要在 windows 上安装虚拟机使用 linux 系统,遂想起来 win10 本身就有 Hyper-V 虚拟工具,但是 win10 家庭版并没有这个服务,百度之,找到了方法(Win10家庭版怎么 ...
- [c/c++]c++控制台操作(基本操作的代码)
本文转自:http://blog.csdn.net/stude/article/details/7645056 控制台窗口界面编程控制 〇.摘要一.概述二.控制台文本窗口的一般控制步骤三.控制台窗口操 ...
- 打破刻板印象,了解真正的商业智能BI
在技术飞速发展的过程中,人们越来越怀疑传统的数据分析方法.可以通过对商业智能的各种误解来解释这一点,如今,这种误解正在作为有效的真理传播.例如,数据仓库已达到其目标.而数据质量似乎也正在失去其相关性 ...
- springMVC整合mybatis,spring
使用spring-mvc创建一个项目的过程 spring的配置十分复杂,很难记忆. 这篇博客用于记录springmvc整合创建过程,虽然步骤有点多,但是每一步都很容易理解,便于以后忘记后参考和记忆. ...
- 【基础知识】CPU 是如何工作的 |CPU 通过总线读取内存的工作方式
一.简单cpu 是如何工作 方式讲解 CPU 的根本任务就是执行指令,对计算机来说最终都是一串由 0 和 1 组成的序列.CPU 从逻辑上可以划分成 3 个模块,分别是控制单元.运算单元和存储单元 ...
- [系统安全] 十六.PE文件逆向基础知识(PE解析、PE编辑工具和PE修改)
[系统安全] 十六.PE文件逆向基础知识(PE解析.PE编辑工具和PE修改) 文章来源:https://masterxsec.github.io/2017/05/02/PE%E6%96%87%E4%B ...
- Qt:QVector
0.说明 template <typename T> class QVector QVector是存储同一个类型T数据的模板类,其功能是动态数组,数据在其中的存储是一系列连续的存储空间. ...
- KETTLE使用中的错误集锦
1.违反唯一主键约束条件:问题是表中有俩个主键,将备用主键替换成真正的主 键或者是没有对数据做出处理加这句话and cft.DEL_FLAG!='1'或者要到的库有此数据 2.field 某列 is ...