设计模式连环炮-建造者模式

    如果有同志看完了前面写的那四篇,就会发现单例和三种工厂模式已经写完了,这也是最入门的四种模式,面试题问到这三种回答不出来,就可以回家等通知了。当然里面还可以有变体,自己去玩吧

    稍微有些了解的人,都知道设计模式分了三大类,创建类、行为类、结构类。这里不难看出,是先讲创建类。后面就可能穿插着讲了。

    中途解释下,是开局忘了说这个事了哈哈哈哈

                                                         


    

    在老浣熊生活过的三十万年里,绝大多数时间都是一个神,没有同伴。在人类这种具备高智商的灵长类生物出现进化转折之前,他唯一的乐趣,就是喷发喷发老火山,逗着森林万物迁移;劈着道道惊雷,望着树杈焦灼。

    但,人类出现后,抱团式进化并衍生出的文明着实让老浣熊惊叹,尤其是,被诗词歌赋美化过的爱情~~   

    老浣熊老了,也渴望像人类那样,寻一城终老 爱一人白首,但只恨人类世界的物理规则对自己并不适用(这种细微的情感变化,你能懂?)

                                                         

    于是乎,老浣熊产生了造自己的灵长类的想法!

    "我要自己种人,等我的人儿进化完成,来一段马拉松式的爱情~~~~"(有钱人的快乐你想象不到,有时间的神的任性你体会不了
 

/*
* 灵长类,就这么画出来了
*/
public class Primates {
    private String head;
    private String hand;
    private String body;
    private String leg;
}

    然后,不落俗套的new。

public static void main(String[] args) {
        Primates primates = new Primates();
        primates.setHead();
        primates.setHand();
        primates.setBody();
        primates.setLeg();
    }

 

    "只知道new,就像总在李诞面前玩谐音梗,不能给高分”

    "现在也是小有成就了,不能总是亲力亲为,也不能把这些灵长类造点更细致、区别化、定制化,嗯,我需要个天使替我做这些事儿~"

 

    首先,就安排了个大天使入场,主管下面一众的灵长类天使


/**
 * 大天使,内部初始化了个灵长类实例
 * 不同的是,对于灵长类的各个部位,都是由子类实现的
 * 大天使不关心这些部门被造成什么样,由对应的狒狒天使和猴子天使实现
 */
public abstract class Archangel {
    protected Primates primates = new Primates();

    public abstract void buildHead();
    public abstract void buildHand();
    public abstract void buildBody();
    public abstract void buildLeg();

    public Primates getPrimates(){
        return primates;
    }
}
---------------------------------------------------------------------
/**
 * 猴子天使,主管猴子的创造
 */
public class MonkeyAngle extends Archangel {
    @Override
    public void buildHead() {
        primates.setHead("猴子的小头");
    }

    @Override
    public void buildHand() {
        primates.setHand("猴子的手臂");
    }

    @Override
    public void buildBody() {
        primates.setBody("猴子的身子");
    }

    @Override
    public void buildLeg() {
        primates.setLeg("猴子的腿");
    }
}
---------------------------------------------------------------------
/**
 * 狒狒天使,主管狒狒的创造
 */
public class BaboonAngle  extends Archangel{
    @Override
    public void buildHead() {
        primates.setHead("狒狒的小头");
    }

    @Override
    public void buildHand() {
        primates.setHand("狒狒的手臂");
    }

    @Override
    public void buildBody() {
        primates.setBody("狒狒的身子");
    }

    @Override
    public void buildLeg() {
        primates.setLeg("狒狒的腿");
    }
}

    可以发现,相比较之前直接对着实体new,这种方式的好处在于,如果可以提前确认好,各个灵长类的头手腿身子各是什么样,就可以提前配置好一个天使类来管理,就不需要new Primates后每次都自己去设置参数了

    

    现在可以直接new了嘛?不可以,因为只定义了对各个部位的设置,要把自己需要用到的所有位置都调用一遍,这个猴子才能造出来呢。

    "那我是不是可以在大天使那就确定好灵长类的建造顺序呢?"
 


public abstract class Archangel {
    protected Primates primates = new Primates();

    public abstract void buildHead();
    public abstract void buildHand();
    public abstract void buildBody();
    public abstract void buildLeg();

    // 这里就把四个部位确定好
    public Primates getPrimates(){
        buildHead();
        buildHand();
        buildBody();
        buildLeg();
        return primates;
    }
}
---------------------------------------------------------------------
public static void main(String[] args) {
        MonkeyAngle monkeyAngle = new MonkeyAngle();
        System.out.println(monkeyAngle.getPrimates());
        BaboonAngle baboonAngle = new BaboonAngle();
        System.out.println(baboonAngle.getPrimates());
}
输出:
Primates(head=猴子的小头, hand=猴子的手臂, body=猴子的身子, leg=猴子的腿)
Primates(head=狒狒的小头, hand=狒狒的手臂, body=狒狒的身子, leg=狒狒的腿)

    "嗯,看起来似乎优雅了不少~~就这么干!"老浣熊自信满满,推着几个天使就出去干活了。

    没过两天,大天使身后跟着狒狒天使和猴子天使过来找老浣熊: "My God,他们两来向您反馈一个事,狒狒和猴子都有自己的创造顺序需求,因为审美不一样,猴子喜欢先造屁股,狒狒喜欢先造手。但因为现在顺序都有我来做了,我觉得是不是可以有个专门建造顺序的角色存在?我就可以专心管理灵长类本身的属性了"

    老浣熊灵光一闪:"这个可以有!那我先把大天使你的建造顺序那儿去了,再来个工匠"

/**
 * 这是个灵长类建造者
 */
public class PrimatesBuilder {
    /** 这里他对接的是大天使
    * 换个角度思考,你会发现这个建造者可以对应更多不同的类和不同建造顺序
    * 做更多的事情
    */
    public void build(Archangel archangel){
        archangel.buildBody();
        archangel.buildHand();
        archangel.buildHead();
        archangel.buildLeg();
    }
}
---------------------------------------------------------------------
MonkeyAngle monkeyAngle = new MonkeyAngle();
primatesBuilder.build(monkeyAngle);
System.out.println(monkeyAngle.getPrimates());
输出——》
Primates(head=猴子的小头, hand=猴子的手臂, body=猴子的身子, leg=猴子的腿)

 

    哟,效果一样,还分离出了对象属性、属性创造和创造本身,老浣熊对这次的进步十分满意。

    "离我退休,又近了一步",老浣熊擦了擦额头的汗水,抬头望向泛黄的夕阳,充实而欣慰~~~

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值