设计模式(11)——建造者模式

建造者模式

一、定义    

建造者模式(Builder):将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示。

二、模式解读:   

类图  

2.2.模式中的角色

  1. 产品(Product):表示被构造的复杂对象。ConcreteBuilder创建该产品的内部表示并定义它的装配过程,包含定义组成部件的类,包括将这些部件装配成最终产品的接口。
  2. 建造者(Builder):为创建一个产品对象的各个部件指定抽象接口。
  3. 具体建造者(ConcreteBuilder):实现Builder的接口以构造和装配该产品的各个部件,定义并明确它所创建的表示,并提供一个检索产品的接口。
  4. 指挥者(Director):指挥并构造一个使用Builder接口的对象。

三、实例:

创建两种车:普通车和赛车,他们都是装配车轮、发动机、车身,只不过选用的部件不同。

1.具体的产品类,即我们要制造的产品汽车

[java]  view plain copy print ?
  1. import java.util.ArrayList;  
  2.   
  3. class Car {  
  4.   
  5.     private ArrayList<String> parts = new ArrayList<String>();  
  6.   
  7.     public void add(String part) {  
  8.         parts.add(part);  
  9.     }  
  10.   
  11.     public void show() {  
  12.         System.out.println("汽车有以下几部分构成:");  
  13.         for (String s : parts) {  
  14.             System.out.println(s);  
  15.         }  
  16.     }  
  17. }  

2.建造产品的抽象类,定义了怎么建造这个产品的方法和产生出来的结果,但是不负责具体建造

[java]  view plain copy print ?
  1. interface Builder {  
  2.       
  3.     public void buildWheel();//装配汽车车轮  
  4.   
  5.     public void buildEngine();//装配汽车发动机  
  6.   
  7.     public void buildBody();//装配汽车车身  
  8.   
  9.     //返回最后装配好的汽车  
  10.     //汽车的组装过程不在这里进行,而是转移到下面的Director类别中进行。从而实现了解耦过程和部件  
  11.     public Car getCar();  
  12.   
  13. }  

3.具体建造类,实现抽象类的所有方法,按照抽象的设计来完成产品的建造和出厂过程,但是可以根据不同的客户需求选用不同的配件,制造出同一类产品实现产品制造这个过程。

普通车的建造

[java]  view plain copy print ?
  1. class ConcreteBuilder1 implements Builder {  
  2.   
  3.     private Car car;  
  4.   
  5.     public ConcreteBuilder() {  
  6.         this.car = new Car();  
  7.     }  
  8.   
  9.     public void buildWheel() {  
  10.         car.add("普通车车轮部分");  
  11.   
  12.     }  
  13.   
  14.     public void buildEngine() {  
  15.         car.add("普通车发动机部分");  
  16.   
  17.     }  
  18.   
  19.     public void buildBody() {  
  20.         car.add("普通车车身部分");  
  21.   
  22.     }  
  23.   
  24.     public Car getCar() {  
  25.         return car;  
  26.     }  
  27.   
  28. }  

赛车的建造

[java]  view plain copy print ?
  1. class ConcreteBuilder2 implements Builder {  
  2.   
  3.     private Car car;  
  4.   
  5.     public ConcreteBuilder() {  
  6.         this.car = new Car();  
  7.     }  
  8.   
  9.     public void buildWheel() {  
  10.         car.add("赛车车轮部分");  
  11.   
  12.     }  
  13.   
  14.     public void buildEngine() {  
  15.         car.add("赛车发动机部分");  
  16.   
  17.     }  
  18.   
  19.     public void buildBody() {  
  20.         car.add("赛车车身部分");  
  21.   
  22.     }  
  23.   
  24.     public Car getCar() {  
  25.         return car;  
  26.     }  
  27.   
  28. }  

 4.有了产品规格,制造流程图,制造车间,还缺一个负责调度的家伙,他来操作制造的机器,但是结果是具体的机器吐出来的产品,所以这个家伙只管闭着眼睛造就行了。

[java]  view plain copy print ?
  1. class Director {  
  2.     public void Construct(Builder builder) {  
  3.         builder.buildWheel();  
  4.         builder.buildEngine();  
  5.         builder.buildBody();  
  6.     }  
  7. }  

5.客户端调用,开始造吧

[java]  view plain copy print ?
  1. public class Client {  
  2.   
  3.     public static void main(String[] args) {  
  4.         Director designer = new Director();  
  5.         Builder builder = new ConcreteBuilder1();  
  6.         designer.Construct(builder);  
  7.         Car car = builder.getCar();  
  8.         car.show();  
  9.   
  10.     }  
  11. }  

如果你在构造一个复杂的东西(对象)的时候,最好把调度者,建造蓝图,产品,建造机器都分开来,这像一个制造流程。

四. 模式总结

 4.1 优点

  • 用户只需要指定要建造的类型就可以得到它们,而具体的建造过程和细节不需要知道。
  • 建造代码与表示相分离,如果要改变一个产品的内部表示,只要再定义一个新的具体的建造者就可以了。
  • 建造过程由指挥者来控制,建造细节由一个抽象类来控制,对于实现建造细节的具体类来说,不会遗漏某一个步骤。

 4.2 缺点

  以上例子说明,现在我要增加产品的一个细节,如把创建方向盘的过程也添加进来,看我们需要改哪些类。

 4.3 实用范围

  • 当创建复杂对象的算法应该独立于该对象的组成部分以及它们的装配方式时。
  • 当复杂对象的部件相对稳定,不会发生变化时
  • 当构造过程必须允许被构造的对象有不同的表示时。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
图像识别技术在病虫害检测中的应用是一个快速发展的领域,它结合了计算机视觉和机器学习算法来自动识别和分类植物上的病虫害。以下是这一技术的一些关键步骤和组成部分: 1. **数据收集**:首先需要收集大量的植物图像数据,这些数据包括健康植物的图像以及受不同病虫害影响的植物图像。 2. **图像预处理**:对收集到的图像进行处理,以提高后续分析的准确性。这可能包括调整亮度、对比度、去噪、裁剪、缩放等。 3. **特征提取**:从图像中提取有助于识别病虫害的特征。这些特征可能包括颜色、纹理、形状、边缘等。 4. **模型训练**:使用机器学习算法(如支持向量机、随机森林、卷积神经网络等)来训练模型。训练过程中,算法会学习如何根据提取的特征来识别不同的病虫害。 5. **模型验证和测试**:在独立的测试集上验证模型的性能,以确保其准确性和泛化能力。 6. **部署和应用**:将训练好的模型部署到实际的病虫害检测系统中,可以是移动应用、网页服务或集成到智能农业设备中。 7. **实时监测**:在实际应用中,系统可以实时接收植物图像,并快速给出病虫害的检测结果。 8. **持续学习**:随着时间的推移,系统可以不断学习新的病虫害样本,以提高其识别能力。 9. **用户界面**:为了方便用户使用,通常会有一个用户友好的界面,显示检测结果,并提供进一步的指导或建议。 这项技术的优势在于它可以快速、准确地识别出病虫害,甚至在早期阶段就能发现问题,从而及时采取措施。此外,它还可以减少对化学农药的依赖,支持可持续农业发展。随着技术的不断进步,图像识别在病虫害检测中的应用将越来越广泛。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值