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 ...
随机推荐
- flask框架安装使用
开篇 个人工作中需要用到flask,所以特地搭建了用一下,熟悉操作 一.centos云服务器环境下 falsk作为一个python的轻量级的web框架,基本上相当于一个内核,各种功能都需要扩展第三方来 ...
- 痞子衡嵌入式:揭秘i.MXRT1170上串行NOR Flash双程序可交替启动设计
大家好,我是痞子衡,是正经搞技术的痞子.今天痞子衡给大家介绍的是i.MXRT1170上串行NOR Flash双程序可交替启动设计. 在上一篇文章 <i.MXRT1060/1010上串行NOR F ...
- 3款自助型BI分析平台功能盘点,帮助你预测商业发展方向
在快速发展的今天,商业智能BI已经不同于传统的商业智能BI,商业智能BI已经逐渐转变为自助和业务主导的模式,自助BI分析平台应运而生,自助BI分析平台逐渐成为许多企业的选择. 自助式BI分析平台与传统 ...
- Python实现JSON序列化和反序列化
在我的应用中,序列化就是把类转成符合JSON格式的字符串,反序列化就是把JSON格式的字符串转换成类.C#的话直接用Newtonsoft.JSON就可以了,非常好用.本来以为python也会有类似的库 ...
- shell脚本加密方式
--作者:飞翔的小胖猪 --创建时间:2021年5月17日 --修改时间:2021年5月17日 说明 shell作为Linux操作系统中原生的语言环境,由于其简单.便捷.可以移植等特性常被运维人员作为 ...
- java创建线程的四种方法
第一种: 通过继承Thread类创建线程 第二种: 通过实现Runnable接口创建线程 这两种早已烂记于心,这里就不作过多的介绍, 主要介绍其源码 Thread类 implements Runna ...
- Tableau绘制K线图、布林线、圆环图、雷达图
Tableau绘制K线图.布林线.圆环图.雷达图 本文首发于博客冰山一树Sankey,去博客浏览效果更好.直接右上角搜索该标题即可 一. K线图 1.1 导入数据源 1.2 拖拽字段 将[日期]托到列 ...
- LeetCode-093-复原 IP 地址
复原 IP 地址 题目描述:给定一个只包含数字的字符串,用以表示一个 IP 地址,返回所有可能从 s 获得的 有效 IP 地址 .你可以按任何顺序返回答案. 有效 IP 地址 正好由四个整数(每个整数 ...
- laravel中{{}}和{!! !!}的区别详解
{{}}支持转义 一段html代码只是被当成普通的字符串输出 {!! !!} 不支持转义 一段html代码可以被正常的解析 public function html(){ $address=" ...
- 4月9日 python学习总结 模块
1.XML模块 xml是实现不同语言或程序之间进行数据交换的协议,跟json差不多,但json使用起来更简单,不过,古时候,在json还没诞生的黑暗年代,大家只能选择用xml呀,至今很多传统公司如金融 ...