工厂方法模式

来源:互联网 发布:iso9126软件质量模型 编辑:程序博客网 时间:2024/06/04 00:50

我们在看一些源码时经常会看到xxxxFactory,这就是工厂模式了。面向对象的23种设计模式点这里。说工厂模式之前先说个段子:有个单身的java程序员,过年回家晚上睡着了。父母看着独生的儿子就着急说“你看也不小了,这没有对象怎么办”,程序员在梦中“随便new 一个”。这个怕是不好new,所以我们要找今天的婚姻介绍所:工厂模式。废话不说,代码伺候:

public class Factory {//简单工厂模式     abstract class 美女 {        abstract void 美女();//就一个方法,喊美女的时候会获得她    }    private class 萝莉美女 extends 美女 {        public void 美女() {            System.out.println("获得一个萝莉美女");        }    }    private class 御姐美女 extends 美女 {        public void 美女() {            System.out.println("获得一个御姐美女");        }    }    public static void main(String[] args) {        Factory factory = new Factory();        美女 萝莉 = factory.获取美女("萝莉");        萝莉.美女();        美女 御姐 = factory.获取美女("御姐");        御姐.美女();    }    萝莉美女 萝莉;    public 美女 获取美女(String type) {        switch (type) {            case "萝莉":                if (萝莉 == null) {//可以看到我们可以控制萝莉是否是单例,也可以控制她喜欢懒汉还是饿汉                    萝莉 = new 萝莉美女();                }                return 萝莉;            case "御姐":                return new 御姐美女();        }        return null;    }}输出:获得一个萝莉美女获得一个御姐美女

我们要知道光萝莉美女还有很多种,为了简单我们只实现萝莉的工厂方法模式:

public class Factory {//工厂方法模式,可以看出是把简单工厂的工厂写成接口,以后加个霸道美女啥的。脸蛋什么的,是为了说明工厂模式的解耦。    abstract static class 美女 {        public String 脸蛋;        public String 身材;        public String 性格;        void 美女(){            System.out.println("脸蛋:" + 脸蛋);            System.out.println("身材:" + 身材);            System.out.println("性格:" + 性格);        }    }    private static class 萝莉美女 extends 美女 {        public void 美女() {            System.out.println("获得一个萝莉美女");            super.美女();        }    }    public static void main(String[] args) {        萝莉美女工厂 萝莉工厂 = new 萝莉美女工厂();        萝莉美女 萝莉 = 萝莉工厂.获取美女("闭月羞花", "娇小", "温柔");        萝莉.美女();    }    萝莉美女 萝莉;    interface 美女工厂 {        美女 获取美女(String 脸蛋, String 身材, String 性格);    }    public static class 萝莉美女工厂 implements 美女工厂 {        @Override        public 萝莉美女 获取美女(String 脸蛋, String 身材, String 性格) {            萝莉美女 萝莉 = new 萝莉美女();            //大家可能发现了,这三个赋值在这儿不好,因为御姐美女也要赋值。            //所以是在美女工厂里提供一个静态方法,还是在美女抽象类里提供构造方法。            //所进行的改动对外没有影响,这就是解耦。            萝莉.脸蛋 = 脸蛋;            萝莉.身材 = 身材;            萝莉.性格 = 性格;            return 萝莉;        }    }}输出:获得一个萝莉美女脸蛋:闭月羞花身材:娇小性格:温柔

可以看到我们把不同的脸蛋、身材的美女也获得了。但还有个问题,那就是萝莉身材不能是:大长腿,所以有了下面的抽象工厂模式。