zoukankan      html  css  js  c++  java
  • 设计模式第3篇:生成器模式(Builder)

    一.生成器模式要解决的问题

      生成器模式主要解决工厂方法模式和抽象工厂模式在所创建的对象包含大量的属性时所面临的问题:

    1. 当客户端程序向工厂类传递大量参数时很容易发生错误,因为很多参数的类型有可能是相同的,并且也很难保证传递参数的顺序。
    2. 在传递参数时有些参数是可选的,但是在工厂设计模式中,所有的餐宿都必须被传递,即使可选参数也应该传递null值。
    3. 如果所要创建的对象本身很复杂,那么工厂类也会很复杂,过于复杂的程序设计不易于团队开发。

    二.生成器模式的要点

    1. 首先需要在外部类中创建一个静态的生成器类,将外部类的参数(成员变量)都在生成器类中重新定义一次,这里有个命名规则,比如外部类如果为Computer,则生成器类名称为ComputerBuilder。
    2. 生成器类需要一个共有构造函数,并将必须参数作为构造函数参数传入。
    3. 生成器类需要有设置可选参数的方法,并且方法返回类型为生成器对象。
    4. 生成器类需要提供一个build()方法来返回需要创建的对象(即外部类对象)。
    5. 外部类需要一个私有构造函数,并且私有构造函数的参数类型为生成器对象。

    三.附java代码如下

    class Phone{
      //必须参数
    private String cpu; private String memory;
      //可选参数
    private boolean isRedColor; private boolean isFullScreen; public String getCpu() { return cpu; } public String getMemory() { return memory; } public boolean isRedColor() { return isRedColor; } public boolean isFullScreen() { return isFullScreen; } private Phone(PhoneBuilder phoneBuilder){ this.cpu=phoneBuilder.cpu; this.memory=phoneBuilder.memory; this.isRedColor=phoneBuilder.isRedColor; this.isFullScreen=phoneBuilder.isFullScreen; } public static class PhoneBuilder{
         //必须参数
    private String cpu; private String memory;
    //可选参数
    private boolean isRedColor; private boolean isFullScreen; public PhoneBuilder(String cpu,String memory){ this.cpu=cpu; this.memory=memory; } public PhoneBuilder setColor(boolean redColor){ this.isRedColor=redColor; return this; } public PhoneBuilder setFullScreen(boolean fullScreen){ this.isFullScreen=fullScreen; return this; } public Phone build(){ return new Phone(this); } } }

    与客户端程序交互代码如下:

    public class TestBuilderPattern {
    
        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        
            Phone phone = new Phone.PhoneBuilder(
                    "1.5 GHz", "2 GB").setColor(true)
                    .setFullScreen(true).build();
        }
    
    }
  • 相关阅读:
    关于阿里云centos 2.6下手机表情输入后无法保存到mysql数据库的问题调研及mysql版本从5.1升级到5.7的全过程纪要
    EXTJS 5 学习笔记2
    EXTJS 5 学习笔记1
    关于java.lang.String理解中的一些难点
    关于centos7中使用rpm方式安装mysql5.7版本后无法使用root登录的问题
    大数据专栏
    过采样中用到的SMOTE算法
    linux后台执行命令:&和nohup
    P,R,F1 等性能度量(二分类、多分类)
    word2vec模型cbow与skip-gram的比较
  • 原文地址:https://www.cnblogs.com/quxiangxiangtiange/p/10211970.html
Copyright © 2011-2022 走看看