精华内容
下载资源
问答
  • 文章借鉴于《设计模式:可复用面向对象软件的基础》 除了名词和图例,别的客户以不用管,后续针对每个模式进行分析 如何将系统分解成对象集合? 关键因素:封装、粒度、依赖关系、灵活性、性能、演化、复用 常用...

    文章借鉴于《设计模式:可复用面向对象软件的基础》

    除了名词和图例,别的客户以不用管,后续针对每个模式进行分析

    如何将系统分解成对象集合?

    • 关键因素:封装、粒度、依赖关系、灵活性、性能、演化、复用
    • 常用设计方法
    1. 写出问题描述,挑出名词、动词,创建相应的类和方法
    2. 关注与系统的协作和职责
    3. 对现实世界建模,映射到设计中

    名词解释

    1. 型构:方法名、参数、返回
    2. 接口:对象操作所定义的所有操作(方法)型构的集合被称为该对象的接口
    3. 类型:标识特定接口的名字(多继承);子类型、超类型
    4. 实例:对象通过实例化来创建,此对象被称为该类的实例
    5. 委托:是一种组合方式,有两个对象参与处理一个请求,接受请求的对象将操作委托给他的代理者(将自己传给委托者,使委托者可以操作自己)

    所用图示:

    类名
    方法

    虚箭头表示一个类实例化另一个类的对象,箭头指向被实例化的对象的类

    类继承(特殊的抽象类,类名和操作等以斜体表示),可以用下图的方式表示伪代码

    组合:箭头表示组合

    模式如何选取(学习过程中记住这些关键点,然后使用)

    1. 考虑涉及模式使如何解决问题的
    2. 浏览模式的意图部分
    3. 研究模式怎么互联
    4. 研究目的相似的模式
    5. 考虑你的设计中哪些使可变的

    展开全文
  •  美国Orcale公司研制的一种关系数据库管理系统,是一个协调服务器和用于支持任务决定应用程序的开放RDBMS。它可以支持多种不同的硬件和操作系统平台,从台式机到大型和超级计算机,为各种硬件结构提供高度的...
  • 1. 名词解释 将一个复杂对象的构建与它的表示分离,...建造者模式(builder)又称为生成器模式,从名词就可以看出,它是一种较为复杂、使用频率也相对较低的创建型模式。建造者模式为客户端返回的不是一个简单的产品...

    1. 名词解释

    将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示。

    比如一台电脑包括主机、显示器、键盘等外设,这些部件组成了完整的一台电脑。如何将这些部件组装成一台完整的电脑并返回给用户,这是建造者模式需要解决的问题。建造者模式(builder)又称为生成器模式,从名词就可以看出,它是一种较为复杂、使用频率也相对较低的创建型模式。建造者模式为客户端返回的不是一个简单的产品,而是一个由多个部件组成的复杂产品。

    2. 建造者模式UML图

    builder

    上图中包含了建造者模式的四个主要角色:

    • Builder(抽象建造者):它为创建一个产品Product对象的各个部件指定抽象方法,在该接口中一般声明两类方法,一类方法是buildPartX(),它们用于创建复杂对象的各个部件;另一类方法是getResult(),它们用于返回复杂对象。Builder既可以是抽象类,也可以是接口。
    • ConcreteBuilder(具体建造者):它实现了Builder抽象方法,实现各个部件的具体构造和装配方法,定义并明确它所创建的复杂对象,也可以提供一个方法返回创建好的复杂产品对象。依赖于Product。
    • Product(产品角色):它是被构建的复杂对象,包含多个组成部件,具体建造者创建该产品的内部表示并定义它的装配过程。
    • Director(指挥者):指挥者又称为导演类,它负责安排复杂对象的建造次序,指挥者与抽象建造者之间存在关联关系,可以在其construct()建造方法中调用建造者对象的部件构造与装配方法,完成复杂对象的建造。客户端一般只需要与指挥者进行交互,在客户端确定具体建造者的类型,并实例化具体建造者对象(也可以通过配置文件和反射机制),然后通过指挥者类的构造函数或者Setter方法将该对象传入指挥者类中。

    3. 建造者模式实现

    下面代码基于Java实现的一个建造者模式。

    @data
    class Product {  
        private String name;  
        private String type;  
        public void showProduct(){  
            System.out.println("名称:"+name);  
            System.out.println("型号:"+type);  
        }  
    }  
    
    //抽象类
    abstract class Builder {  
        public abstract void buildPart(String arg1, String arg2);  
        public abstract Product getProduct();  
    }  
    
    //具体建造者
    class ConcreteBuilder extends Builder {  
        private Product product = new Product();  
    
        public Product getResult() {  
            return product;  
        }  
    
        public void buildPart(String arg1, String arg2) {  
            product.setName(arg1);  
            product.setType(arg2);  
        }  
    }  
    
    // 指挥者 
    public class Director {  
        private Builder builder;
    
        public Director(Builder builder) {
           this.builder=builder;
        }
    
        public void setBuilder(Builder builder) {
           this.builder=builer;
        } 
        public Product construct(){  
            builder.buildPart("lenvono","Y470");  
            return builder.getResult();  
        }   
    }  
    //客户端调用
    public class Client {  
        public static void main(String[] args){ 
            Builder builder = new ConcreteBuilder(); 
            Director director = new Director(builder);  
            Product product = director.construct();  
            product1.showProduct();  
        }  
    }复制代码

    四个角色都包含在上面的实现中,客户端进行调用,对于客户端而言,只需关心具体的建造者即可。在指挥者类中可以注入一个抽象建造者类型的对象,其核心在于提供了一个建造方法construct(),在该方法中调用了builder对象的构造部件的方法,最后返回一个产品对象。

    4. 与工厂模式区别

    建造者模式的优点是封装性好,且易于扩展。上面提到,对于客户端而言,只需关心具体的建造者即可。使用建造者模式可以优先的封装变化,product和builder比较稳定,主要的业务逻辑封装在控制类中对整体可取得比较好的稳定性。如需扩展,只需要加一个新的建造者,对之前代码没有影响。

    与工厂模式相比,建造者模式一般用来创建更为复杂的对象,因为对象的创建过程更为复杂,因此将对象的创建过程独立出来组成一个新的类——指挥者类。也就是说,工厂模式是将对象的全部创建过程封装在工厂类中,由工厂类向客户端提供最终的产品;而建造者模式中,建造者类一般只提供产品类中各个组件的建造,而将具体建造过程交付给指挥者类。由指挥者类负责将各个组件按照特定的规则组建为产品,然后将组建好的产品交付给客户端。

    5. 总结

    本文讲解了设计模式中的建造者模式,大的分类属于创建型模式。首先介绍了建造者模式的概念;然后给出了建造者模式的类图,并对其中涉及到的四个角色进行了解释;又给出了基于Java实现的代码;最后简单说了下其优点,与工厂模式的区别。建造者模式主要适用于创建一些复杂的对象,这些对象的内部组成构件间的建造顺序是稳定的,但是对象的内部组成构件面临着复杂的变化。

    订阅最新文章,欢迎关注我的公众号

    微信公众号


    参考

    1. 《java与模式》阎宏
    2. 23种设计模式(4):建造者模式
    展开全文
  • 将一个复杂对象的构建过程与它的表示分离,使得同样的构建过程可以创建不同的表示,属于创建型模式。 使用建造者模式对于用户而言只需要指定需要建造的类型和内容就可以获得对象,建造过程及细节不需要了解,其根本...

    名词解释

    Builder Pattern

    将一个复杂对象的构建过程与它的表示分离,使得同样的构建过程可以创建不同的表示,属于创建型模式。

    使用建造者模式对于用户而言只需要指定需要建造的类型内容就可以获得对象,建造过程及细节不需要了解,其根本目的是解耦过程部件

    适用场景

    适用于创建对象需要很多步骤,且步骤的顺序不一定固定。为了达到灵活创建对象的目的,可以使用建造者模式。另外,如果采用链式编程的写法,也可以是代码更简洁一些。

    写法

    1. 创建一个静态内部类 Builder,然后将所用参数从外部类copy到 Builder中,内部类的取名最好和外部类保持一致,如外部类叫Computer,内部类则叫ComputerBuilder;
    2. 内部类提供一个包含所有必填参数的公共构造函数;
    3. 内部类提供可以设置可选参数的方法,改方法返回Builder对象本身(链式编程);
    4. 最后,内部类提供一个build()方法,用于生成最终的外部类对象,所以,外部类,应该提供一个私有的参数为内部类的构造函数
     /**
         * 必填参数
         */
        private String HDD;
        private String RAM;
    
        /**
         * 可选参数
         */
        private boolean isGraphicsCardEnabled;
        private boolean isBluetoothEnabled;
    
        public String getHDD() {
            return HDD;
        }
        public String getRAM() {
            return RAM;
        }
        public boolean isGraphicsCardEnabled() {
            return isGraphicsCardEnabled;
        }
        public boolean isBluetoothEnabled() {
            return isBluetoothEnabled;
        }
    
        private Computer(ComputerBuilder builder) {
            this.HDD = builder.HDD;
            this.RAM = builder.RAM;
            this.isGraphicsCardEnabled = builder.isGraphicsCardEnabled;
            this.isBluetoothEnabled = builder.isBluetoothEnabled;
        }
    
        @Override
        public String toString() {
            return "Computer{" +
                    "HDD='" + HDD + '\'' +
                    ", RAM='" + RAM + '\'' +
                    ", isGraphicsCardEnabled=" + isGraphicsCardEnabled +
                    ", isBluetoothEnabled=" + isBluetoothEnabled +
                    '}';
        }
    
        /**
         * 建造者类
         */
        public static class ComputerBuilder{
            /**
             * 必填参数
             */
            private String HDD;
            private String RAM;
            /**
             * 可选参数
             */
            private boolean isGraphicsCardEnabled;
            private boolean isBluetoothEnabled;
    
            public ComputerBuilder(String hdd, String ram){
                this.HDD=hdd;
                this.RAM=ram;
            }
            public ComputerBuilder setGraphicsCardEnabled(boolean isGraphicsCardEnabled) {
                this.isGraphicsCardEnabled = isGraphicsCardEnabled;
                return this;
            }
            public ComputerBuilder setBluetoothEnabled(boolean isBluetoothEnabled) {
                this.isBluetoothEnabled = isBluetoothEnabled;
                return this;
            }
    
            public Computer build(){
                return new Computer(this);
            }
        }
    

    测试类

    public static void main(String[] args) {
            //Using builder to get the object in a single line of code and
            //without any inconsistent state or arguments management issues
            Computer comp = new Computer.ComputerBuilder("500 GB", "2 GB")
                    .setBluetoothEnabled(true)
                    .setGraphicsCardEnabled(true).build();
            System.out.println(comp);
        }
    

    源码中应用

    1. JDK的 java.lang.StringBuilder#append() (unsynchronized)
    2. JDK的 java.lang.StringBuffer#append() (synchronized)
    3. MyBatis 的CacheBuilder和SqlSessionFactoryBuilder
    4. Spring中的 BeanDefinitionBuilder
    展开全文
  • 工厂方法模式同样属于类的创建型模式又被称为多态工厂模式 。 工厂方法模式的意义是定义一个创建产品对象的工厂接口,将实际创建工作推迟到子类当中。 定义一个创建对象的抽象方法,由子类决定要实例化的类(对象...

    定义

    • 工厂方法模式同样属于类的创建型模式又被称为多态工厂模式 。
    • 工厂方法模式的意义是定义一个创建产品对象的工厂接口,将实际创建工作推迟到子类当中。
    • 定义一个创建对象的抽象方法,由子类决定要实例化的类(对象实例化由子类实现)
    • 这样进一步抽象化的好处是使得工厂方法模式可以使系统在不修改具体工厂角色的情况下引进新的产品。

    名词解释

    • 抽象工厂(Creator)角色:工厂方法模式的核心,任何工厂类都必须实现这个接口(FruitFactory)
    • 具体工厂( Concrete Creator)角色:具体工厂类是抽象工厂的一个实现,负责实例化产品对象。(AppleFactory)
    • 抽象(Product)角色:工厂方法模式所创建的所有对象的父类,它负责描述所有实例所共有的公共接口。(Fruit)
    • 具体产品(Concrete Product)角色:工厂方法模式所创建的具体实例对象(Orange)

    代码如下

    
    public class test1 {
        public static void main(String[] args) {
            FruitFactory orangeFactory = new OrangeFactory();
            Fruit fruit = orangeFactory.getFruit();
            fruit.eat();
    
            FruitFactory grapeFactory = new GrapeFactory();
            Fruit fruit1 = grapeFactory.getFruit();
            fruit1.eat();
        }
    }
    interface Fruit {
        void eat();
    }
    interface FruitFactory {
         Fruit getFruit();
    }
    
    class Orange implements Fruit {
        @Override
        public void eat() {
            System.out.println("吃橘子");
        }
    }
    class OrangeFactory implements FruitFactory {
    
        @Override
        public Fruit getFruit() {
            return new Orange();
        }
    }
    
    class Grape implements Fruit {
        @Override
        public void eat() {
            System.out.println("吃葡萄");
        }
    }
    class GrapeFactory implements FruitFactory {
    
        @Override
        public Fruit getFruit() {
            return new Grape();
        }
    }
    
    

    工厂方法模式和简单工厂模式比较

    • 工厂方法模式与简单工厂模式在结构上的不同不是很明显。
    • 工厂方法类的核心是一个抽象工厂类,而简单工厂模式把核心放在一个具体类上。
    • 工厂方法模式之所以有一个别名叫多态性工厂模式是因为具体工厂类都有共同的接口或者有共同的抽象父类。
    • 当系统扩展需要添加新的产品对象时,仅仅需要添加一个具体对象以及一个具体工厂对象,原有工厂对象不需要进行任何修改,也不需要修改客户端
    • 很好的符合了“开放-封闭”原则。而简单工厂模式在添加新产品对象后不得不修改工厂方法,扩展性不好。
      • 工厂方法模式退化后可以演变成简单工厂模式。
    展开全文
  • 名词解释 Adapter Pattern 将两个不兼容的类纠合在一起使用,属于结构型模式,需要有Adaptee(被适配者)和Adaptor(适配器)两个身份 应用背景 我们经常碰到要将两个没有关系的类组合在一起使用,第一解决方案是:修改...
  • 常用设计模式及 Java程序设计 第一章设计模式基础 一:什么是设计模式 在面向对象的软件设计中,总是希望避免重复设计或尽可能少做重复设计。有经验的面向对象 设计者的确能做出良好的设计,而新手则面对众多选择...
  • 本书论述运用UML(统一建模语言)和模式进行对象建模的方法和技巧,重点讨论了如何使用面向对象的分析和设计技术来建造一个健壮的和易于维护的系统。 全书叙述清晰、图文并茂、实例丰富,是一部来自于大量经验的...
  • 这种类型的设计模式属于创建型模式,它提供了一种创建对象的最佳方式。这种模式涉及到一个单一的类,该类负责创建自己的对象,同时确保只有单个对象被创建。这个类提供了一种访问其唯一的对象的方式,可以直接访问,...
  • 4.1 名词解释与操作符(Name Explanation & Operators) 103 4.1.1 名词解释(Some Name Explanations) 103 4.1.2 操作符汇总(Operators Summary) 105 4.1.3 操作符的说明(Operator Expanations) 105 4.2 算术...
  • 3. Web服务器:Tomcat 5.5及以上版本,配合MVC设计模式及 Hibernate开发架构; 4. 客户端运行环境:能运行IE 5以上或Netscape 5以上浏览器的操作系统,配合使用Ajax技术; 5. 客户端运行工具:目前的系统采用...
  • 软件工程教程

    热门讨论 2012-07-06 23:10:29
    在创业公司或者是独立开发者,盈利方式主要2种: 为国外公司外包开发,或者通过Google的移动广告(AdMob)点击分成。 通过付费下载的形式来盈利的,现在国内鲜见成功者。 第三类开发者 和第二类开发者类似。开发者...
  • HTML开发王

    2013-01-03 11:33:09
    14.5 网页国际化和区域化的相关名词 14.6 巩固与自测 第15章 应用样式表呈现和布局 15.1 为什么要使用样式表 15.1.1 过去的不足和样式表的优点 15.1.2 了解css(层迭样式表) 15.1.3 html 4对样式表技术的支持 15.2 ...
  • java面试题典 java 面试题 经典

    热门讨论 2010-06-18 13:42:36
    43. WEB SERVICE名词解释。JSWDL开发包的介绍。JAXP、JAXM的解释。SOAP、UDDI,WSDL解释。 26 三、 JSP 27 1. JSP中动态INCLUDE与静态INCLUDE的区别? 27 2. JSP的内置对象及方法。 27 3. JSP的常用指令 27 4. 页面间...
  • [HTML开发王].张亚飞.扫描版

    热门讨论 2011-09-13 12:45:04
    14.5 网页国际化和区域化的相关名词 14.6 巩固与自测 第15章 应用样式表呈现和布局 15.1 为什么要使用样式表 15.1.1 过去的不足和样式表的优点 15.1.2 了解css(层迭样式表) 15.1.3 html 4对样式表技术的支持 15.2 ...
  • (s1+1运算结果是int,需要强制转换类型) short s1 = 1; s1 += 1;(可以正确编译) 29、Math.round(11.5)等於多少? Math.round(-11.5)等於多少? Math.round(11.5)==12 Math.round(-11.5)==-11 round方法返回...
  • java 面试题 总结

    2009-09-16 08:45:34
    (s1+1运算结果是int,需要强制转换类型) short s1 = 1; s1 += 1;(可以正确编译) 26、Math.round(11.5)等於多少? Math.round(-11.5)等於多少? Math.round(11.5)==12 Math.round(-11.5)==-11 round方法返回与...
  • 商务智能架构图表

    2011-10-21 19:47:31
    动画工程师考虑表面材质、动画渲染方法等,交互设计师也会介入进行用户交互行为模式设计。 所以一个数据可视化作品或项目的创建,需要多领域专业人士的协同工作才能取得成功。人类能够操纵和解释如此来源多样、...
  • 专业名词 名词解释 HTML5 万维网的核心语言、标准通用标记语言下的一个应用超文本标记语言(HTML)的第五次重大修改 Android 一种基于Linux的自由及开放源代码的操作系统,主要使用于移动设备,如智能手机和平板...
  • 3.9 设计模式 55 3.9.1 具体化视图 56 3.9.2 无值列 56 3.9.3 聚合键 56 3.10 需要记住的几件事 57 3.11 小结 57 第4章 应用实例 59 4.1 数据模型设计 59 4.2 酒店应用的关系数据库设计 60 4.3...
  • java基础题 很全面

    2009-05-09 09:24:24
    23. WEB SERVICE名词解释。JSWDL开发包的介绍。JAXP、JAXM的解释。SOAP、UDDI,WSDL解释。 19 24. 应用服务器与WEB SERVER的区别? 20 25. 应用服务器有那些? 20 EJB/服务器 20 1. EJB与JAVA BEAN的区别? 20 2. EJB是...
  • 最新Java面试宝典pdf版

    热门讨论 2011-08-31 11:29:22
    6、请对以下在J2EE中常用的名词进行解释(或简单描述) 129 7、如何给weblogic指定大小的内存? 129 8、如何设定的weblogic的热启动模式(开发模式)与产品发布模式? 129 9、如何启动时不需输入用户名与密码? 130 10、...
  • Java面试宝典2010版

    2011-06-27 09:48:27
    6、请对以下在J2EE中常用的名词进行解释(或简单描述) 7、如何给weblogic指定大小的内存? 8、如何设定的weblogic的热启动模式(开发模式)与产品发布模式? 9、如何启动时不需输入用户名与密码? 10、在weblogic管理制...
  • java面试宝典

    2013-02-28 16:04:01
    209、WEB SERVICE名词解释。JSWDL开发包的介绍。JAXP、JAXM的解释。SOAP、UDDI,WSDL解释。 52 210、STRUTS的应用(如STRUTS架构) 52 211、开发中都用到了那些设计模式?用在什么场合? 52 212、UML方面 52 213、如何...
  • 千方百计笔试题大全

    2011-11-30 21:58:33
    209、WEB SERVICE名词解释。JSWDL开发包的介绍。JAXP、JAXM的解释。SOAP、UDDI,WSDL解释。 52 210、STRUTS的应用(如STRUTS架构) 52 211、开发中都用到了那些设计模式?用在什么场合? 52 212、UML方面 52 213、如何...
  • Java SE 6.0编程指南 源码

    热门讨论 2012-05-18 13:40:45
    书中的实例 基本每一句都有详细的解释,所以还是比较好的。 目录如下:(下载的源文件里也有) 第一篇 起步篇 第1章 初识Java 3 1.1 Java简介 3 1.1.1 Java的不同平台 3 1.1.2 Java发展的历程 3 1.1.3 ...
  • 6、请对以下在J2EE中常用的名词进行解释(或简单描述) 129 7、如何给weblogic指定大小的内存? 129 8、如何设定的weblogic的热启动模式(开发模式)与产品发布模式? 129 9、如何启动时不需输入用户名与密码...
  • 11.2.2 在名词前面添加“所有……的集合”几个字 172 11.2.3 删除问题语句中的行为动词 173 11.2.4 仍然可以使用存根 173 11.2.5 不要担心数据的显示 174 11.2.6 第一次尝试需要专门处理 175 11.2.7 ...
  • C#微软培训教材(高清PDF)

    千次下载 热门讨论 2009-07-30 08:51:17
    第二部分 C#程序设计基础.28 第四章 数 据 类 .28 4.1 值 类 .28 4.2 引 用 类 .33 4.3 装箱和拆箱 .39 4.4 小 结 .42 第五章 变量和常量 .44 5.1 变 量 .44 5.2 常 量 .46 5.3 小 结 .47 ...
  • C#微软培训资料

    2014-01-22 14:10:17
    第二部分 C#程序设计基础.28 第四章 数 据 类 .28 4.1 值 类 .28 4.2 引 用 类 .33 4.3 装箱和拆箱 .39 4.4 小 结 .42 第五章 变量和常量 .44 5.1 变 量 .44 5.2 常 量 .46 5.3 小 结 .47 ...

空空如也

空空如也

1 2
收藏数 37
精华内容 14
关键字:

创建型设计模式名词解释