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 ...
随机推荐
- 信而泰IPv6协议一致性测试解决方案
信而泰IPv6协议一致性测试解决方案 背景 中国已经开始逐步进入万物互联的社会,相比原来的手机.电脑等接入网络,万物互联时代接入网络的智能终端会海量增加,而且在万物互联时代,网络的流量巨大,互联的 ...
- 快来用这款BI分析工具,摆脱数据分析的困扰
互联网.物联网时代,数据激增是正常现象,但这给公司信息部门和数据分析师带来了巨大的工作量.根据以前的分析方法,有必要详细而深入地完成分析报告,即使借助数据分析工具,也要花费大量的时间和人力,更不用说 ...
- 带你掌握Redis数据类型:string和Hash
摘要:Redis中有五大数据类型,分别是String.List.Set.Hash和Zset. 本文分享自华为云社区<Redis的string类型常用命令解析>,作者:灰小猿 . 先问大家一 ...
- WPF界面语言切换
举例中英文切换: 一.静态切换(每次切换需要重启应用) 1. 新建一个WPF APP(.NET Framework)项目,StaticLanguageSelect 2. 右击项目名,添加New Ite ...
- Hive数仓
分层设计 ODS(Operational Data Store):数据运营层 "面向主题的"数据运营层,也叫ODS层,是最接近数据源中数据的一层,数据源中的数据,经过抽取.洗净. ...
- 打靶笔记-03-vulhub-Moriarty Corp
打靶笔记-03-vulhub-BoredHackerBlog 一.靶机信息 Name: BoredHackerBlog: Moriarty Corp(中-高级难度) Date release: 29 ...
- [C++]C风格、C++风格和C++11特性的线程池
线程池概念 假设完成一项任务需要的时间=创建线程时间T1+线程执行任务时间T2+销毁线程时间T3,如果T1+T3的时间远大于T2,通常就可以考虑采取线程池来提高服务器的性能 thread pool就是 ...
- OpenSSL CVE-2022-0778漏洞问题复现与非法证书构造
本文介绍CVE-2022 0778漏洞及其复现方法,并精心构造了具有一个非法椭圆曲线参数的证书可以触发该漏洞. 本博客已迁移至CatBro's Blog,那是我自己搭建的个人博客,欢迎关注.本文链接 ...
- unity 加载网络图片
摘要:利用Http加载网络图片. 解决思路: 1.直接用unity 自带的www加载,在高版本www已经过时了. 2.本文直接使用万能的文件流加载. (1)使用System.Net.HttpWebRe ...
- Caffeine缓存详解
概要 Caffeine是一个高性能,高命中率,低内存占用,near optimal 的本地缓存,简单来说它是 Guava Cache 的优化加强版,有些文章把 Caffeine 称为"新一代 ...