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 ...
随机推荐
- kali linux 安装lanmp遇到的问题
安装LANMP步骤(需要ROOT权限)2020版本以上的Linux kali需要百度参考修改权限得文章 root@kali:~# wget http://dl.wdlinux.cn/files/lan ...
- 做PPT必备的大数据分析网站,好看又免费的报表工具
小明以前是学技术,跳槽来到一家大公司,在这个公司里会经常开会,比如有月度报告.季度报告以及年度报告,在开会前小明了解到同事们都会制作精美的PPT来汇报工作计划和目标,看到同事们精美的PPT里各种好看的 ...
- 【C#基础概念】程序集与托管模块的概念
本文是为了学习程序集而整理的网上资料,主要包括两个部分,概念和使用,前部分讲怎样理解程序集,后部分讲述怎样使用的细节. 程序集与托管模块的概念 "程序集与托管代码块"(摘自Hima ...
- 判断访问类型是pc端还是移动端
/** * 判断访问类型是电脑还是手机 */ $(function(){ var mobile_flag = isMobile(); // true为PC端 ...
- 用RecyclerView实现列表视图
RecyclerView能够灵活实现大数据集的展示,视图的复用管理比ListView更好,能够显示列表.网格.瀑布流等形式,且不同的ViewHolder能够实现item多元化的功能.但是使用起来会稍微 ...
- think php 7天免登录
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...
- java下载镜像
镜像地址 https://repo.huaweicloud.com/java/jdk/ 如果你不知道选择哪个版本就点击下面这个链接吧 https://repo.huaweicloud.com/java ...
- BSOJ6387题解
算是刷新了我对树上问题的认知 首先第一问随便做一个 \(O(nk)\) 的 DP 就可以草过去,考虑第二问. 我们将问题分为两个部分:走儿子边的答案和走父亲边的答案.最后拼接一下就好了. 设 \(fd ...
- (acwing蓝桥杯c++AB组)1.1 递归
(acwing蓝桥杯c++AB组)1.课程介绍+递归 文章目录 (acwing蓝桥杯c++AB组)1.课程介绍+递归 课程介绍 第一讲 递归与递推 递归 引入 递归的底层调用顺序 例题与练习 课程介绍 ...
- Django-Multitenant,分布式多租户数据库项目实战(Python/Django+Postgres+Citus)
Python/Django 支持分布式多租户数据库,如 Postgres+Citus. 通过将租户上下文添加到您的查询来实现轻松横向扩展,使数据库(例如 Citus)能够有效地将查询路由到正确的数据库 ...