《种设计模式详解及实现方式培训课件》由会员分享,可在线阅读,更多相关《种设计模式详解及实现方式培训课件(19页珍藏版)》请在金锄头文库上搜索。
1、1,第四讲,建造者模式(Buider),2,场景翻译机,MM最爱听的就是我爱你这句话了,见到不同地方的MM,要能够用她们的方言跟她说这句话哦,我有一个多种语言翻译机,上面每种语言都有一个按键,见到MM我只要按对应的键,它就能够用相应的语言说出我爱你这句话了,国外的MM也可以轻松搞掂,这就是我的我爱你builder。(这一定比美军在伊拉克用的翻译机好卖),3,Builder模式概述,Builder模式是一种创建型模式,它主要是应对项目中一些复杂对象的创建工作。 所谓“复杂对象”是指:此对象中还含有其它的子对象。 意图:将一个复杂的构建与其表示相分离,使得同样的构建过程可以创建不同的表示。,4,B
2、uilder模式概述,建造者模式将产品的内部表象和产品的生成过程分割开来,从而使一个建造过程生成具有不同的内部表象的产品对象。 使用该模式可以逐步地构造对象,使得对象的创建更具弹性。生成器模式的关键是将一个包含有多个组件对象的创建分成若干个步骤,并将这些步骤封装在一个称作生成器的接口中。,5,相关的模式,抽象工厂(Abstract Factory)模式 共性:创建型模式、创建类对象 区别: Abstract Factory模式:解决“系列对象”的需求变化 Builder模式:解决“对象部分”的需求变化,通常和组合模式结合使用,6,Builder模式的角色,产品(Product) 抽象生成器(B
3、uilder) 具体生成器(ConcreteBuilder) 指挥者(Director),7,Builder模式结构,建造者(Builder)角色 具体建造者(Concrete Builder)角色 产品(Product)角色 指导者(Director)角色,8,Builder模式示例,1产品(Product): PanelProduct.java import javax.swing.*; public class PanelProduct extends JPanel JButton button; JLabel label; JTextField textField; ,9,Builde
4、r模式示例,2抽象生成器(Builder): Builer.java import.javax.swing.*; public interface Builder public abstract void buildButton(); public abstract void buildLabel(); public abstract void buildTextField(); public abstract JPanel getPanel(); ,10,Builder模式示例,3具体生成器(ConcreteBuilder)_1:ConcreteBuilderOne.java import
5、javax.swing.*; public class ConcreteBuilderOne implements Builder private PanelProduct panel; ConcreteBuilderOne() panel=new PanelProduct(); public void buildButton() panel.button=new JButton(按钮); public void buildLabel() panel.label=new JLabel(标签); public void buildTextField() panel.textField=new J
6、TextField(文本框); public JPanel getPanel() panel.add(panel.button); panel.add(panel.label); panel.add(panel.textField); return panel; ,11,Builder模式示例,3具体生成器(ConcreteBuilder)_2:ConcreteBuilderTwo.java import javax.swing.*; public class ConcreteBuilderTwo implements Builder private PanelProduct panel; C
7、oncreteBuilderTwo() panel=new PanelProduct(); public void buildButton() panel.button=new JButton(button); public void buildLabel() panel.label=new JLabel(label); public void buildTextField() panel.textField=new JTextField(textField); public JPanel getPanel() panel.add(panel.textField); panel.add(pan
8、el.label); panel.add(panel.button); return panel; ,12,Builder模式示例,4指挥者(Director):Director.java import javax.swing.*; public class Director private Builder builder; Director(Builder builder) this.builder=builder; public JPanel constructProduct() builder.buildButton(); builder.buildLabel(); builder.bu
9、ildTextField(); JPanel product=builder.getPanel(); return product; ,13,Builder模式示例,5应用 Application.java import javax.swing.*; public class Application public static void main(String args) Builder builder=new ConcreteBuilderOne(); Director director=new Director(builder); JPanel panel=director.constru
10、ctProduct(); JFrame frameOne=new JFrame(); frameOne.add(panel); frameOne.setBounds(12,12,200,120); frameOne.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE); frameOne.setVisible(true); builder=new ConcreteBuilderTwo(); director=new Director(builder); panel=director.constructProduct(); JFrame frameT
11、wo=new JFrame(); frameTwo.add(panel); frameTwo.setBounds(212,12,200,120); frameTwo.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE); frameTwo.setVisible(true); ,14,优缺点,建造者模式的使用使得产品的内部表象可以独立的变化。使用建造者模式可以使客户端不必知道产品内部组成的细节。 每一个Builder都相对独立,而与其它的Builder无关。 可使对构造过程更加精细控制。 将构建代码和表示代码分开。 当增加新的具体生成器时,不必修改指挥者的代码,即该模式满足开-闭原则。 建造者模式的缺点在于难于应付“分步骤构建算法”的需求变动。,15,适用性,复杂的内部结构 相互依赖的各部分创建过程独立 各部分变化剧烈,组合算法相对稳定,16,总结,Builder模式的实质是:解决一个复杂对象的创建工作。明确变化的部分和相对稳定的部分,隔离变化,解耦稳定的组装过程和变化的具体部件,使得我们不用去关心每个部件是如何组装的;如何将具体部件和组装算法隔离是要解决的问题。,17,建造者模式的几种演化,省略抽象建造者角色,18,建造者模式的几种演化,省略指导者角色,19,建造者模式的几种演化,合并建造者角色和产品角色,