如果有同志看完了前面写的那四篇,就会发现单例和三种工厂模式已经写完了,这也是最入门的四种模式,面试题问到这三种回答不出来,就可以回家等通知了。当然里面还可以有变体,自己去玩吧
稍微有些了解的人,都知道设计模式分了三大类,创建类、行为类、结构类。这里不难看出,是先讲创建类。后面就可能穿插着讲了。
中途解释下,是开局忘了说这个事了哈哈哈哈
在老浣熊生活过的三十万年里,绝大多数时间都是一个神,没有同伴。在人类这种具备高智商的灵长类生物出现进化转折之前,他唯一的乐趣,就是喷发喷发老火山,逗着森林万物迁移;劈着道道惊雷,望着树杈焦灼。
但,人类出现后,抱团式进化并衍生出的文明着实让老浣熊惊叹,尤其是,被诗词歌赋美化过的爱情~~
老浣熊老了,也渴望像人类那样,寻一城终老 爱一人白首,但只恨人类世界的物理规则对自己并不适用(这种细微的情感变化,你能懂?)
于是乎,老浣熊产生了造自己的灵长类的想法!
"我要自己种人,等我的人儿进化完成,来一段马拉松式的爱情~~~~"(有钱人的快乐你想象不到,有时间的神的任性你体会不了)
/*
* 灵长类,就这么画出来了
*/
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=猴子的腿)
哟,效果一样,还分离出了对象属性、属性创造和创造本身,老浣熊对这次的进步十分满意。
"离我退休,又近了一步",老浣熊擦了擦额头的汗水,抬头望向泛黄的夕阳,充实而欣慰~~~