一文了解简单工厂模式升级版-工厂模式

336 阅读3分钟

1. 简单工厂模式的问题

前面有关简单工厂模式的文章说过,简单工厂模式违背了设计原则中的开闭原则,并不符合规范,所以严格上来说,简单工厂模式其实并不属于设计模式范畴。我们在实际开发过程中,经常需要通过工厂来创建、获取不同的实例对象,解耦生产和实现。那我们是否可以调整简单工厂模式的方案,使之符合设计原则呢?

我们先想一想,简单工厂模式违背了开闭原则的地方,就是新增一个产品的时候,需要去修改工厂,加入新的实现逻辑。那如果我们调整工厂实例化的地方,使之新增产品也不需要去修改工厂的逻辑,不就符合开闭原则了么。按照简单工厂模式的过程,我们再把工厂通过接口的方式,把工厂在封装一层呢?

2. 调整简单工厂模式的方案,符合开闭原则

  1. 要隔离依赖,怎么少的了接口呢,我们先用一个接口表示鞋子工厂
public interface Shoes {
}
public class Nike implements Shoes{
}
public class Adidas implements Shoes {
}
//你们所有的鞋子工厂都要继承我
public interface IShoesFactory {
    Shoes createShoes();
}
  1. 有了工厂,我们需要2个实现工厂,分别生产adidas和nike
public class AdidasFactory implements IShoesFactory {
    @Override
    public Shoes createShoes() {
        return new Adidas();
    }
}
public class NikeFactory implements IShoesFactory {
    @Override
    public Shoes createShoes() {
        return new Nike();
    }
}
  1. 有了鞋子的代工厂,我们通过代工厂来获取产品
public class ShoesStore {
    //我的鞋子在这里哟
    List<Shoes> myShoes = new ArrayList();
    //我有白饭鱼又无敌
    public void myShoes() throws UnknowShoeType {
        IShoesFactory adsft = new AdidasFactory();
        Shoes ad= adsft.createShoes();
        //我有一双白饭鱼啦
        myShoes.add(ad);
        IShoesFactory nikeft = new NikeFactory();
        Shoes nike = nikeft.createShoes();
        //我有一双无敌啦
        myShoes.add(nike);
    }
}

这个过程很简单,就是鞋子类还是不变,通过一个Shoes接口,来实现隔离,然后因为工厂实例化这边违反了关闭原则,我们再定义一个鞋子工厂接口:IShoesFactory,来实现工厂和实例过程之间的隔离。这样的话,我们要新增一个LiNing的鞋子产品,无需改动工厂了,而是通过新增的方式:

public class LiNing implements Shoes {
}
public class ShoesStore {
    //我的鞋子在这里哟
    List<Shoes> myShoes = new ArrayList();
    //我有白饭鱼又无敌
    public void myShoes() throws UnknowShoeType {
        IShoesFactory adsft = new AdidasFactory();
        Shoes ad= adsft.createShoes();
        //我有一双白饭鱼啦
        myShoes.add(ad);
        IShoesFactory nikeft = new NikeFactory();
        Shoes nike = nikeft.createShoes();
        //我有一双无敌啦
        myShoes.add(nike);
        //新增的代码===============================
        IShoesFactory lnft = new LiNingFactory();
        Shoes lining = lnft.createShoes();
        //我有一双李宁啦
        myShoes.add(lining); 
        //新增的代码===============================
    }
}

3. 总结

到了这里,看得出来,要想对扩展开发,对修改关闭,就得通过接口来实现(PS:接口不是固定就只能是interface类型,这是一种统称,对对象和功能的抽象统一,实际场景中,只要符合业务场景,我也可以通过抽象类或普通类,来作为对外接口,产品类只要继承就行了)。所以你会经常听到要面向接口编程,就是要可以分离依赖和实现,打开开闭原则的要求。

❤️ 看完小事件

如果你觉得这篇内容对你有一点帮助或启发,想请你动动小指拇:

点赞,让更多的人也能看到这篇内容(收藏加点赞,永远不慌张(乛◡乛))。

关注公众号[ 撸透JAVA开发 ],不定期分享原创知识。

溜达溜达公众号,看看其他文章是否对你也有启发或公众号留言,一起交流。

img
img

本文使用 mdnice 排版