Java设计模式--工厂模式的自述

最近想学习设计模式,于是就买了一本《大话设计模式》,刚开始学,感觉还不错,这里做些整理和总结。


工厂模式的自我介绍

大家好,我是工厂模式,我的职业是某个家族的管家,主要管理家族里面的子女,他们什么时候该出来,这些是我要做的事,虽然每天工作的很辛苦,因为要想好谁该上谁不该上,这的确很伤神,但是这也是我的乐趣所在。

工厂模式的生活

每天起床做完正常人该做的事情之后,就是我一天工作的开始了,老爷会准备好少爷小姐们可能会用到的东西,安排好他们可以做的事情,当然,他们也可以有自己的事情做,毕竟大家都是年轻人,每个人都有自己独特的个性。
而我,会在需要做什么工作的时候,知道应该派他们之中的哪个去工作。尽管我不是很了解他们的内在,但是凭我多年的经历和经验,我看人准没错。
有些时候,老爷又会为家族添一新丁,我也会很快知道他应该在什么岗位做什么事情。有些时候,我都会佩服我自己,为什么那么牛逼。

家谱(伪UML类图)

Java设计模式--工厂模式的自述_第1张图片

大概我就是这么个情况,每次看到这个家谱图,我都很感叹,老爷年纪都那么大了,真能生啊。。。
  • 我们家一直很平静,直到我遇到了一位程序员(代码篇)

说件搞笑的事,曾经有位程序员来我们家里做客,看了我们家谱图之后,有感而发,发明了一个什么什么工厂模式,从此风骚到现在。他说把我们家的家谱变成代码,就是代码界的风云。然后给我看了以下东西,老夫到现在还是云里雾里的。

老爷血统

public class 老爷血统 {

    protected String 桌子;
    protected String 凳子;

    public void 骑马(){
        System.out.println("老爷骑马");
    }

    public void 跑步(){
        System.out.println("老爷跑步");
    }

}

小儿子

public class 小儿子  extends 老爷血统{

    private String 玩具枪;
    private String 玩具车;

    public void 骑马马(){
        System.out.println("骑马马");
    }

    public void 吃东西(){
        System.out.println("吃东西");
    }

    @Override
    public void 骑马() {
        System.out.println("小儿子骑马最慢");
    }

    @Override
    public void 跑步() {
        System.out.println("小儿子跑步最慢");
    }

}

大儿子

public class 大儿子   extends 老爷血统{

    private String 书;
    private String 本;
    private String 笔;

    public void 看书(){
        System.out.println("看书");
    }

    public void 写诗(){
        System.out.println("写诗");
    }

    @Override
    public void 骑马() {
        System.out.println("大儿子骑马一般");
    }

    @Override
    public void 跑步() {
        System.out.println("大儿子跑步最快");
    }

}

小女儿

public class 小女儿  extends 老爷血统 {

    private String 洋娃娃;
    private String 小皮鞋;

    public void 跳舞(){
        System.out.println("跳舞");
    }

    public void 吃糖葫芦(){
        System.out.println("吃糖葫芦");
    }

    @Override
    public void 骑马() {
        System.out.println("小女儿骑马一般");
    }

    @Override
    public void 跑步() {
        System.out.println("小女儿跑步一般");
    }

}

大女儿

public class 大女儿  extends 老爷血统 {

    private String 漂亮的衣服;

    public void 唱歌(){
        System.out.println("唱歌");
    }

    public void 弹琴(){
        System.out.println("弹琴");
    }

    @Override
    public void 骑马() {
        System.out.println("大女儿骑马最快");
    }

    @Override
    public void 跑步() {
        System.out.println("大女儿跑步一般");
    }

}

管家我:

public class 管家 {

    public static 老爷血统 决定谁去(String 去干嘛){

        老爷血统 某儿女 = null;

        switch (去干嘛) {

        case "骑马":
            某儿女 = new 大女儿();
            break;

        case "跑步":
            某儿女 = new 大儿子();
            break;

        }

        return 某儿女;

    }

}

某一天(工厂模式使用具体方法)
可以看出工厂模式的特点,大家在使唤这个管家的时候,完全不需要关心别的东西,只需要告诉管家我需要那种人就行了,这样就降低了代码和耦合度,使用者根本不需要知道儿女的特点。

/**
 * 这是某一天的生活
 */
public class 某一天 {

    public static void main(String[] args) {

        /*
         * 情境一:
         * 村里跑步大赛,管家觉决定选一个人去参加比赛
         */

        老爷血统 某儿女1 = 管家.决定谁去("跑步");
        某儿女1.跑步();

        /*
         * 情境二:
         * 村里骑马大赛,管家选一个人去参加比赛
         */

        老爷血统 某儿女2 = 管家.决定谁去("骑马");
        某儿女2.骑马();

    }

}

运行结果:

大儿子跑步最快
大女儿骑马最快

那个程序员说,我在这个程序里面,本来应该叫ChildFactory,但是这样叫不太合适,怕老爷戴绿帽子,所以就这样叫啦。他还说,我的真正状态应该是这样的。

Father father = ChildFactory.choose("run");
father.run();

正经说话系列

工厂模式主要在什么时候用:

  • 多个类继承某个类的时候
  • 当不知道创建哪个类的时候
  • 希望某个子类代替老爸做某件事的时候

有哪些人参与:

  • 老爸(父类):他决定做某件事
  • 儿女(子类):他去做那件事
  • 管家(工厂):选择哪个儿女去做那件事

话说管家作为ChildFactory无论如何,我看着有点不爽。。。。

再举个栗子,这个栗子保证新鲜,额,我是说,保证正经。

父类:运算。准备2个数,要做的事情是运算出2个数字的某种算法的结果
子类:加减乘除,一共4个类,重写父类的算法
工厂:根据不同的要求,创建某个对象。
比如:

Operation oper = OperationFactory.createOperation("+");
oper.getResult();

使用工厂模式的好处:

  • 不需要知道你创建的是哪个类,用,就对了
  • 创建类的时候,不是单纯的A a = new A();而是A a = new A1()看着高端
  • 拓展性强,以后需要什么就创建一个相应的类继承父类就行了,不需要关其他子类的内容,再在工厂类里面稍微改一下就行了,独立性好
  • 用了优秀的模式,同样的工作,别人加班到半夜,你准时下班

工厂模式说完了,撤!

你可能感兴趣的:(Java设计模式)