构造函数,set()方法和建造者模式(Builder)

一个对象有如下属性

public class Man(){

    private String name;

    private String sex;

    private String mobile;

}

如果要创建这样一个对象创最原始的方法是

Man man = new Man();

如果要设置对象的属性则:

Man.setParam(value);

或在创建时调用有参构造进行赋值

Object obj = new Object(value);

但调用有参构造需要先创建构造方法

public Man(String name){

    super();

    name =  this.name;

}

另外构造方法也有弊端

1.当一个对象创建了有参构造时,原有的无参构造会被取代

如果继续调用无参构造

Man man = new Man();

会有编译时异常 The constructor Man() is undefined;

只能

Man man = new Man(name); 

或者新增一个无参构造

public class Man(){

    private String name;

    private String sex;

    private String mobile;

    public Man(String name){

        super();

     name = this.name;

    }

    public Man(){

    }

}

如果通过构造函数对多个属性进行赋值,如果有N个参数,为了能够灵活创建对象,那么需要写n(n-1)/2+1个构造方法才能满足需要。(1是为了无参构造)

当然给对象赋属性除了构造方法外还有Set方法可以赋值

public class Man(){

    private String name;

    private String sex;

    private String mobile;

    public Man(){

    }

    public void setName(String name){

    name = this.name;  // 这里name与this.name的区别是 前面的name取的是对象中的name属性而this.name则是一个临时变量也就是setName中的参数

    }

}

如果有N个参数通过set方法进行赋值,需要写n个set方法。

但是set方法也有个缺点

如果我要给对象赋三个值:

Man man = new Man();

man.setName("张三");

man.setSex("男");

man.setMobile("13212341234");

每次都需要对象.set方法。

对于参数繁多,并且参数必填与非必填不确定因素多的实体,建造者模式是一种更好的选择。

什么是建造者?

建造者模式是设计模式的一种,将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示。 --- 来自《百度百科》

建造者模式包含  

    一个实体(Object):要被创建的对象。

    一个接口(BuilderInterface):提供建造方法。

    一个实现类(BuilderImplement):为各个属性赋值。

    一个建造方法(Buildercontract):用来把各个属性组装成需要的实体。

当你需要用创建者模式创建对象时,也可以用一个内部类当作创建者(简化):

public class Man {

    private String name;

    private String sex;

    private String mobile;

    public String getName() {

        return name;

    }

    public void setName(String name) {

        this.name = name;

    }

    public String getSex() {

        return sex;

    }

    public void setSex(String sex) {

        this.sex = sex;

    }

    public String getMobile() {

        return mobile;

    }

    public void setMobile(String mobile) {

        this.mobile = mobile;

    }

    public Man(String name, String sex, String mobile) {

        super();

        this.name = name;

        this.sex = sex;

        this.mobile = mobile;

    }

    public static class builder{

        private String name;

        private String sex;

        private String mobile;

        public builder(){

        }

        public Man.builder setName(String name){

            this.name = name;

            return this;

        }

        public Man.builder setSex(String sex){

            this.sex = sex;

            return this;

        }

        public Man.builder setMobile(String mobile){

            this.mobile = mobile;

            return this;

        }

        public Man buildConstract(){

            return new Man(this.name, this.sex, this.mobile);

        }

    }

}

创建实体代码:

Builder build = new Man.Builder();

Man m = build.setMobile("123").setName("张三").setSex("男").buildConstact();

如果要创建另一个只有名字不同的对象,

Man m2 = build.setName("李四");

建造者模式下,当创建出一个需要的对象后,建造者(build)对象依然存在,可以重复使用,并且不会对已经创建的对象进行修改。

这种模式下缺点也很明显,相比较于构造方式创建对象,建造者模式下创建对象所需要的空间比直接用构造方法多。构造方法创建对象只需要开辟一块空间出来,而构造者需要两块。

当需要批量创建对象时,建造者模式是一种更好的选择。

对比:

        创建单个对象所需内存空间: 用构造方法 = 用set方法 < 用建造者模式

        创建单个对象的执行速度:用构造方法 > 用set方法 >  用建造者模式

        灵活性:用构造方法 < 用set方法 < 用建造者模式

总结:建造者模式下将对象与构造相互分离,对于属性并且非必填的对象可以更加简化创建的流程,对创建相似度高的对象也很方便,但建造者模式下会占用一部分空间,导致性能的下降,如果只是为了创建一个对象,不推荐用建造者模式。


    有三个人想要个椅子。

    第一个人直接买了一把椅子但是他不喜欢这个颜色,花了50块。(构造)

    第二个人自己买钉子,木头做了一把,他很喜欢自己做的这把椅子,但是自己做太累了(set属性),花了50块。(set)

    第三个人找个木匠按自己的要求做了一把,成品他很满意,花了100块。(建造者)

你可能感兴趣的:(构造函数,set()方法和建造者模式(Builder))