1. 简单工厂模式的问题
前面有关简单工厂模式的文章说过,简单工厂模式违背了设计原则中的开闭原则,并不符合规范,所以严格上来说,简单工厂模式其实并不属于设计模式范畴。我们在实际开发过程中,经常需要通过工厂来创建、获取不同的实例对象,解耦生产和实现。那我们是否可以调整简单工厂模式的方案,使之符合设计原则呢?
我们先想一想,简单工厂模式违背了开闭原则的地方,就是新增一个产品的时候,需要去修改工厂,加入新的实现逻辑。那如果我们调整工厂实例化的地方,使之新增产品也不需要去修改工厂的逻辑,不就符合开闭原则了么。按照简单工厂模式的过程,我们再把工厂通过接口的方式,把工厂在封装一层呢?
2. 调整简单工厂模式的方案,符合开闭原则
- 要隔离依赖,怎么少的了接口呢,我们先用一个接口表示鞋子工厂
public interface Shoes {
}
public class Nike implements Shoes{
}
public class Adidas implements Shoes {
}
//你们所有的鞋子工厂都要继承我
public interface IShoesFactory {
Shoes createShoes();
}
- 有了工厂,我们需要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();
}
}
- 有了鞋子的代工厂,我们通过代工厂来获取产品
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开发 ],不定期分享原创知识。
溜达溜达公众号,看看其他文章是否对你也有启发或公众号留言,一起交流。

本文使用 mdnice 排版