zoukankan      html  css  js  c++  java
  • 设计模式一建造者模式

    使用情况:
    类的构造器或者静态工厂中具有多个可变参数

    优点如下:
    各个具体的建造者相互独立,有利于系统的扩展。
    客户端不必知道产品内部组成的细节,便于控制细节风险。
    缺点如下:
    产品的组成部分必须相同,这限制了其使用范围。
    如果产品的内部变化复杂,该模式会增加很多的建造者类。

    建造者(Builder)模式由
    产品、抽象建造者、具体建造者、指挥者等 4 个要素构成

    构建器
    静态内部类可以
         调用外部类的构造方法

         访问外部类静态成员变量和方法
    静态内部类可以:
        
    声明普通成员变量和方法(普通内部类不能声明静态类成员变量和方法)

         在创建静态类内部对象时,不需要其外部类的对象。

       内部类被static修饰后,随着Outer类加载到内存
    被static修饰的内部类也会加载到内存中,也就是说jvm会将硬盘上的Outer.class和
    Outer$Inner.class文件一起加载到内存中,这样可以把一个静态内部类理解为一个
    和外部类一样的类,不需要外部类的对象来调用。
    如果想要创建静态内部类的对象,因为已经被加载到内存中,随时可以创建静态内部类的对象

    不需要创建Outer的对象,只需要根据内部类的名字创建就可以
    Outer.Inner in = new Outer.Inner();
     1 public class Builder {
     2     /**
     3      * filal只能赋值一次
     4      * 可在定义时初始化
     5      * 可在构造方法中赋值
     6      * 可在构造代码块中赋值
     7      */
     8     private final String name;
     9     private final int age;
    10     private final String grand;
    11     private final int birthday;
    12 
    13     public static class Build {
    14         //必须的参数
    15         private final String name;
    16         private final int age;
    17         //有默认值的参数
    18         private String grand = "男";
    19         private int birthday = 0;
    20 
    21         public Build(String name, int age) {
    22             this.name = name;
    23             this.age = age;
    24         }
    25 
    26         public Build build1(String grand) {
    27             this.grand = grand;
    28             return this;
    29         }
    30 
    31         public Build build2(int birthday) {
    32             this.birthday = birthday;
    33             return this;
    34         }
    35 
    36         public Builder toBuilder() {
    37             return new Builder(this);
    38         }
    39     }
    40 
    41     //外部类的构造方法
    42     private Builder(Build build) {
    43         name = build.name;
    44         age = build.age;
    45         grand = build.grand;
    46         birthday = build.birthday;
    47     }
    48 
    49     //使用
    50     public static void main(String[] args) {
    51         Builder builderDemo = new Builder.Build("小明", 12).build1("男").toBuilder();
    52         System.out.println(builderDemo.birthday);
    53     }
    54 }
  • 相关阅读:
    js数组与字符串的相互转换
    JS怎么把字符串数组转换成整型数组
    element-UI的操作步骤steps每一项添加事件,比如click,hover
    element-UI ,Table组件实现拖拽效果
    修改本机域名localhost为任意你想要的名称
    el-tree 设置目录树中的某个节点为高亮状态
    Akka-CQRS(2)- 安装部署cassandra cluster,ubuntu-16.04.1-LTS and MacOS mojave
    Akka-CQRS(1)- Write-side, Persisting event sources:CQRS存写端操作方式
    Akka-CQRS(0)- 基于akka-cluster的读写分离框架,构建gRPC移动应用后端架构
    Akka-Cluster(6)- Cluster-Sharding:集群分片,分布式交互程序核心方式
  • 原文地址:https://www.cnblogs.com/loveer/p/11273443.html
Copyright © 2011-2022 走看看