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

什么是抽象工厂模式?

在这里插入图片描述

抽象工厂模式与工厂方法模式虽然主要意图都是为了解决接口选择问题。但实际上,抽象工厂是⼀个中心工厂,是创建其他工厂的模式。


为何使用抽象工厂模式?

为何要使用抽象工厂模式呢,已经存在的工厂模式难道不能解决所有问题吗?
首先大家可以去看看我上一篇文章工厂模式
思考一下,其实还有些地方是可以进行解耦的,这个时候就需要我们的抽象工厂模式来解决其中的问题。


如何使用?

接上上篇的工厂模式

调用

	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) {
 		//createAnt()返回一个附带属性的蝼蚁对象
        WlltAnt wlltAnt2 = AntFactory.createAnt("香蕉2");
        eat(wlltAnt2);
    }

结果

蝼蚁一次性吃完了2根糯糯的香蕉去学习了

香蕉类

@Data
public class Banana {

    private WlltAnt ant;

    public Banana() {
    }

    public Banana(WlltAnt ant) {
        this.ant = ant;
    }

    void goExercise() {
        if (null==ant){
            System.out.println("吃了根香蕉去健身了");
            return;
        }
        System.out.println("蝼蚁一次性吃完了" + ant.getNum() + "根" + ant.getFlavor() + "香蕉" + ant.getTodo());
    }
}

木瓜类

@Data
public class Papaya {
    private WlltAnt ant;

    public Papaya() {
    }

    public Papaya(WlltAnt ant) {
        this.ant = ant;
    }

    void goMassage() {
        if (null==ant){
            System.out.println("吃了个木瓜去按摩了");
            return;
        }
        System.out.println("蝼蚁吃了" + ant.getNum() + "个" + ant.getFlavor() + "木瓜" + ant.getTodo());
    }
}

草莓类

@Data
public class Strawberry {
    private WlltAnt ant;

    public Strawberry() {
    }

    public Strawberry(WlltAnt ant) {
        this.ant = ant;
    }

    void goStrawberry() {
        if (null==ant){
            System.out.println("吃了个草莓去种草莓了");
            return;
        }
        System.out.println("蝼蚁一次性吃完了" + ant.getNum() + "个" + ant.getFlavor() + "草莓" + ant.getTodo());
    }
}

我们可以从调用的代码中发现重复的建立如此多的水果对象。
这时候项目经理抽了风的添加需求 。
咱们就需要更多类型的水果,需要更多的对象以及臃肿庞大的ifelse用来判断水果的类型
这一时间我们就可以使用抽象工厂模式来当灵丹妙药给PM治疗多年的抽风问题

抽象工厂类

public interface IFactory {
    Fruit create(WlltAnt wlltAnt);
}

水果接口

public interface Fruit {
    void eat();
}

水果工厂集

public class BananaFactory implements IFactory{

    @Override
    public Fruit create(WlltAnt wlltAnt) {
        return new Banana(wlltAnt);
    }
}

public class PapayaFactory implements IFactory{

    @Override
    public Fruit create(WlltAnt wlltAnt) {
        return new Papaya(wlltAnt);
    }
}
public class StrawberryFactory implements IFactory{

    @Override
    public Fruit create(WlltAnt wlltAnt) {
        return new Strawberry(wlltAnt);
    }
}

香蕉类

@Data
public class Banana implements Fruit {

    private WlltAnt ant;

    public Banana() {
    }

    public Banana(WlltAnt ant) {
        this.ant = ant;
    }
    
    @Override
    public void eat() {
        if (null==ant){
            System.out.println("吃了根香蕉去健身了");
            return;
        }
        System.out.println("蝼蚁一次性吃完了" + ant.getNum() + "根" + ant.getFlavor() + "香蕉" + ant.getTodo());
    }
}

其他水果类同香蕉一样

最高司令发起命令

    public static void main(String[] args) {
        WlltAnt wlltAnt = AntFactory.createAnt();
        IFactory papayaFactory = new PapayaFactory();
        Fruit papaya = papayaFactory.create(wlltAnt);
        papaya.eat();
    }

假设PM想吃其他的水果,只要改动一行代码即可!再也不怕PM抽风了。

总结

  • 抽象工厂模式,所要解决的问题就是在⼀个产品族,存在多个不同类型的产品情况下,接口选择的问题。而这种场景在业务开发中也是非常多见的,只不过可能有时候没有将它们抽象化出来
  • 你的代码只是被ifelse埋上了! 当你知道什么场景下何时可以被抽象工程优化代码,那么你的代码层级结构以及满足业务需求上,都可以得到很好的完成功能实现并提升扩展性和优雅度。
  • 那么这个设计模式满足了;单⼀职责、开闭原则、解耦等优点。
  • 缺点是抽象工厂模式太重了,如果 IFactory 接口需要新增功能,则会影响到所有的具体工厂类。使用抽象工厂模式,替换具体工厂时只需更改一行代码,但要新增抽象方法则需要修改所有的具体工厂类。所以抽象工厂模式适用于增加同类工厂这样的横向扩展需求,不适合新增功能这样的纵向扩展。 当然也可以引入其他设计模式(如代理模式)来弥补这一缺陷

最后
设计模式总目录

我是蝼蚁,云云众生里最没有存在感的动物,欢迎大佬广提建议
©️2020 CSDN 皮肤主题: 大白 设计师:CSDN官方博客 返回首页