Java一天GET一个设计模式之工厂模式

什么是工厂模式?

工厂模式又名工厂方法,是⼀种创建型设计模式,其在父类中提供⼀个创建对象的方法,由子类决定实例化对象的类型。

为什么要用工厂模式?

这种设计模式也是 Java 开发中最常见的⼀种模式,它的主要意图是定义⼀个创建对象的接口,让其子类自己决定实例化哪⼀个工厂类,工厂模式使其创建过程延迟到子类进行。

简单说就是为了提供代码结构的扩展性,屏蔽每⼀个功能类中的具体实现逻辑。让外部可以更加简单的只是知道调用即可。当然这可能也有⼀些缺点,比如需要实现的类非常多,如何去维护,怎样减低开发成本。但这些问题都可以在后续的设计模式结合使用中,逐步降低。

怎么样使用工厂模式

在提到怎样使用前,假设一个业务场景

蝼蚁压抑了就想吃香蕉去健身
上班累了就想吃木瓜去按摩
开心了就想吃草莓然后回家种草莓
多种类型的水果,味道,吃完后想去做的事是不一样的

假设按照正常的逻辑实现

  public static void main(String[] args) {
        WlltAnt wlltAnt = new WlltAnt();
        wlltAnt.setStatus(1); 
        WlltAnt wlltAnt2 = new WlltAnt();
        wlltAnt2.setStatus(2); 
        WlltAnt wlltAnt3 = new WlltAnt();
        wlltAnt3.setStatus(3);
        eat(wlltAnt);
        eat(wlltAnt2);
        eat(wlltAnt3);
    }

    static void eat(WlltAnt ant) {
        if (1 == ant.getStatus()) {
            //压抑的蝼蚁
            Banana banana = new Banana(ant);
            banana.goExercise();
        } else if (2 == ant.getStatus()) {
            //累了的蝼蚁
            Papaya papaya = new Papaya(ant);
            papaya.goMassage();
        } else if (3 == ant.getStatus()) {
            //开心的蝼蚁
            Strawberry strawberry = new Strawberry(ant);
            strawberry.goStrawberry();
        }
    }

运行结果:

吃了根香蕉去健身了
吃了个木瓜去按摩了
吃了个草莓去种草莓了

项目经理突然抽风:改个需求吧
蝼蚁分别想吃不同口味的不同的数量的去坐不同的事

public static void main(String[] args) {
        WlltAnt wlltAnt = new WlltAnt();
        wlltAnt.setStatus(1);
        //添加口味
        wlltAnt.setFlavor("糯糯的");
        WlltAnt wlltAnt2 = new WlltAnt();
        wlltAnt2.setStatus(2);
        wlltAnt2.setFlavor("香香的");
        //添加数量
        wlltAnt2.setNum(3);
        WlltAnt wlltAnt3 = new WlltAnt();
        wlltAnt3.setStatus(3);
        wlltAnt3.setFlavor("酸酸的");
        //做不同的事
        wlltAnt3.setTodo("去干点不可描述的事");
        eat(wlltAnt);
        eat(wlltAnt2);
        eat(wlltAnt3);
    }

    static void eat(WlltAnt ant) {
        if (1 == ant.getStatus()) {
            //压抑的蝼蚁
            Banana banana = new Banana(ant);
            banana.goExercise();
        } else if (2 == ant.getStatus()) {
            //累了的蝼蚁
            Papaya papaya = new Papaya(ant);
            papaya.goMassage();
        } else if (3 == ant.getStatus()) {
            //开心的蝼蚁
            Strawberry strawberry = new Strawberry(ant);
            strawberry.goStrawberry();
        }
    }

运行结果:

吃了根糯糯的香蕉去健身了
吃了3个香香的木瓜去按摩了
吃了个酸酸的草莓去干点不可描述的事

项目经历再次抽风再改需求:现在又来了三十只蝼蚁

发现项目经历每次抽风都要在原有的代码上去改动(破坏了开闭原则),三十只蝼蚁就意味着去添加三十个对象(ps:阔以搞个循环嘛),但是需要添加着不同的属性,循环这里就不再那么适合了,这个时候就可以假如工厂模式,添加一个蝼蚁工厂类,让工厂去给我建立对象,我们只需要做选择就好了。。

蝼蚁工厂

 static WlltAnt createAnt(String type) {
        WlltAnt wlltAnt = new WlltAnt();
        switch (type) {
            case "香蕉1":
                wlltAnt.setStatus(1);
                wlltAnt.setTodo("去学习了");
                wlltAnt.setNum(1);
                wlltAnt.setFlavor("糯糯的");
                break;
            case "香蕉2":
                wlltAnt.setStatus(1);
                wlltAnt.setTodo("去学习了");
                wlltAnt.setNum(2);
                wlltAnt.setFlavor("糯糯的");
                break;
            case "香蕉3":
                wlltAnt.setStatus(1);
                wlltAnt.setTodo("去学习了");
                wlltAnt.setNum(3);
                wlltAnt.setFlavor("糯糯的");
                break;
            case "木瓜学习":
                wlltAnt.setStatus(2);
                wlltAnt.setTodo("去学习了");
                break;
            case "木瓜按摩":
                wlltAnt.setStatus(2);
                wlltAnt.setTodo("去按摩了");
                break;
            case "草莓酸酸":
                wlltAnt.setStatus(3);
                wlltAnt.setFlavor("酸酸的");
                break;
            case "草莓甜甜":
                wlltAnt.setStatus(3);
                wlltAnt.setFlavor("甜甜的");
                break;
                //根据不同的口味,数量,想去做的事去建立不同的对象
        }
        return wlltAnt;
    }

调用工厂

		//根据不同的对象去选择就好
		WlltAnt wlltAnt = AntFactory.createAnt("草莓酸酸");
        WlltAnt wlltAnt2 = AntFactory.createAnt("香蕉2");
        WlltAnt wlltAnt3 = AntFactory.createAnt("木瓜按摩");
        		//more ...
        eat(wlltAnt);
        eat(wlltAnt2);
        eat(wlltAnt3);
蝼蚁吃了个酸酸的草莓
蝼蚁吃了2根香蕉去
蝼蚁吃了个木瓜去按摩了

总结

(皮)简单工厂模式可以给我们带来项目经历经常抽风的问题。
从上到下的优化来看,⼯⼚⽅法模式并不复杂,甚⾄这样的开发结构在你有所理解后,会发现更加简单了。
那么这样的开发的好处知道后,也可以总结出来它的优点。

避免创建者与具体的产品逻辑耦合 、 满足单⼀职责,
每一个业务逻辑实现都在所属自己的类中完成 、 满足开闭原则

以上案例都是从简开发,实际开发中我们还可以去优化,根下次学习的抽象工厂相关

总目录

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值