[设计模式]
来源:互联网 发布:windows搭建ss教程 编辑:程序博客网 时间:2024/06/05 14:37
今天学习了设计模式中的建造者模式(Builder Pattern),这个模式也是属于四种设计模式中的创建型模式,四种模式如下所示:
建造者模式结构图如下:
在建造者模式中,我们需要用到四种角色:
1. Director:指挥者,根据用户需求来构建小人对象
2. Builder:建造者接口,用于创造Product各个部件指定的接口。内含建造Product的方法
3. ConcretedBuilder:实现Builder接口,用于构造和装配各个部件
4. Product:具体产品
总结构建者模式:将一个复杂对象的构建和他的表示分离,使得同样的构建过程可以创建不同的表示。
下面我们就以建造汽车的例子来示范一下建造者模式:
Car代码:
/** * Created by YanMing on 2017/5/20. */public class Car { public String wheel; public String body; public String brand; public void setCarWheel(String wheel){ this.wheel = wheel; } public void setCarBody(String body){ this.body = body; } public void setCarBrand(String brand){ this.brand = brand; } public void showMyCar(){ System.out.println("Brand: " + this.brand +"\n"+ "Body: " + this.body +"\n" + "Wheel: " + this.wheel + "\n"); }}Builer 接口:
/** * Created by YanMing on 2017/5/20. */public interface CarBuilder { public void BuildeCarWheel(); public void BuildeCarBody(); public void BuildeCarBrand(); public Car FinishBuild();}BenzBuilder 代码:(FordBuilder省略)
/** * Created by YanMing on 2017/5/20. */public class BenzBuilder implements CarBuilder { Car benz = new Car(); @Override public void BuildeCarWheel() { System.out.println("Benz Wheel building!"); benz.setCarWheel("Benz Wheel"); } @Override public void BuildeCarBody() { System.out.println("Benz Body building!"); benz.setCarBody("Benz Body"); } @Override public void BuildeCarBrand() { System.out.println("Benz Brand building!"); benz.setCarBrand("Benz Brand"); } @Override public Car FinishBuild() { return benz; }}Director代码:
/** * Created by YanMing on 2017/5/20. */public class CarDirector { public void Construct(CarBuilder cb){ cb.BuildeCarBrand(); cb.BuildeCarBody(); cb.BuildeCarWheel(); }}
在主类中调用代码:
/** * Created by YanMing on 2017/5/20. */public class BuilderPattern { public static void main(String arrgs []){ CarDirector director = new CarDirector(); BenzBuilder benzBuilder = new BenzBuilder(); FordBuilder fordBuilder = new FordBuilder(); director.Construct(benzBuilder); Car benz = benzBuilder.FinishBuild(); benz.showMyCar(); }}运行结果:
小思考:在我看来,建造者模式,每次只能返回一个对象。并且由于返回的对象和建造者模式是耦合的,如果我们想要多个Product对象,就必须实现Product类的Deep Copy。所以,我想能否将建造者函数内部的Product 改为传参,然后对引用对象进行加工呢?
就好像去饭店自带食材,因为厨师只有一份食材哈哈~
本文GitHub源码下载
P.S.文章不妥之处还望指正
阅读全文
0 0
- 设计模式
- 设计模式
- 设计模式
- 设计模式
- 设计模式
- 设计模式
- 设计模式~~~~~~~~~~
- 设计模式
- 设计模式
- 设计模式
- 设计模式
- 设计模式
- 设计模式
- 设计模式
- 设计模式
- 设计模式
- 设计模式
- 设计模式
- Hive学习 第一课
- 2015这一年,我都干嘛了
- gcc命令
- 解决faster-rcnn中训练时assert(boxes[:,2]>=boxes[:,0]).all()的问题
- sklearn之线性模型
- [设计模式]
- CSS选择器
- java 编程思想课后题(第五章)
- this.setState is not a function
- 读书笔记《Effective C++》条款25:考虑写出一个不抛异常的swap函数
- JS调用浏览器自带下载功能下载图片
- 《机器学习》(周志华)学习笔记(一)
- 解决华为系列手机Log显示不全
- 浅谈前后端分离技术