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 ...
随机推荐
- 防世界之Web_warmup
题目: 啥都没有,右键打开页面源代码查看一下 发现source.php源文件,输入http://111.200.241.244:53776/source.php看看 <?php high ...
- 我哭了 看到RCNN 和FAST RCNN时 想着为什么要选候选框呢?能不能直接回归出来候选框?
这是不是一个超级好的IDEA 我是不是要发顶会了!!! 看到yolo 直接绝望 果然 你能想到的都已经被发表了. 生不逢时啊!!!
- 口碑最好的五款BI工具都在这了
目前,无论是大企业还是小企业,都面临着数字化转型的挑战.在这个过程中,BI工具起到了举足轻重的作用.市面上打着BI的旗号,实际却只是单纯数据工具的产品不少,客户在进行BI 选型时,眼花缭乱,不知所措. ...
- C++ 派生类函数重载与虚函数继承详解
目录 一.作用域与名字查找 1.作用域的嵌套 2.在编译时进行名字查找 3.名字冲突与继承 4.通过作用域运算符来使用隐藏的成员 二.同名函数隐藏与虚函数覆盖 1.几种必须区分的情况 2.一个更复杂的 ...
- 利用SSH隧道加密技术隐蔽C&C通信流量
在网络攻防博弈中,网络流量特征分析类安全防御措施得到了广泛应用.众多厂商和企业对网络流量进行恶意流量分析检测,从而针对性的采取防御措施,如各级ISP在骨干网络设备上大多采用网络流量分析检测的防御方案. ...
- 【windows 访问控制】一、访问令牌
访问令牌(Access tokens) 访问令牌是描述进程或线程的安全上下文的对象.令牌中的信息包括与进程或线程关联的用户帐户的标识和特权信息.当用户登录时,系统通过将用户密码与安全数据库(如域认证中 ...
- 从零开始,开发一个 Web Office 套件(6):光标 & Click 事件
<从零开始, 开发一个 Web Office 套件>系列博客目录 这是一个系列博客,最终目的是要做一个基于 HTML Canvas 的.类似于微软 Office 的 Web Office ...
- Spring5框架学习笔记(详细)
目录 01 Spring框架概述 02 IOC容器 IOC概念和原理 IOC BeanFactory接口 IOC操作 Bean管理(概念) IOC操作 Bean管理(基于xml方式) IOC操作 Be ...
- starter
传统的 Spring 项目想要运行,不仅需要导入各种依赖,还要对各种 XML 配置文件进行配置,十分繁琐,但 Spring Boot 项目在创建完成后,即使不编写任何代码,不进行任何配置也能够直接运行 ...
- docker安装以及常用命令
yum-config-manager 对/etc/yum.repos.d/下的.repo文件进行增删改查 yum install -y yum-utils 添加docker源,由于yum源的docke ...