工厂方法模式

我们在看一些源码时经常会看到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 萝莉;
        }
    }
}
输出:
获得一个萝莉美女
脸蛋:闭月羞花
身材:娇小
性格:温柔

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值