设计模式之工厂模式
工厂模式又分为:
- 简单工厂模式
- 工厂方法模式
- 抽象工厂模式
工厂模式应当遵守以下OOP原则:
- 开闭原则:对扩展开放,对修改关闭(就是说在原有功能上我们不做修改,但是可以添加新的功能)
- 依赖倒置原则:我们应当面向接口编程而不是面向实现编程(因为面向接口编程会更为的稳定而具体的实现是多变的耦合程度会高)
- 迪米特法则:只与你的朋友交谈不和陌生人交谈,目的是为了降低耦合,降低依赖提高模块的独立性。
工厂模式的优点之为什么要使用工厂模式?
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-3e5biw8i-1593909095429)(C:\Users\l\AppData\Roaming\Typora\typora-user-images\image-20200704170106332.png)]
工厂模式的实现方式
简单工厂模式(静态工厂模式)(弊端就是无法满足开闭原则)
当增加一个品牌的车是我们是需要修改代码才能完善的
下面我先写了一个Car接口,然后写了两个类Baoma和Tsela实现Car接口
public class Consumer {
public static void main(String[] args) {
//在这样的一种情况下我们需要去了解接口和实现类才能new出对象来 于是我们可以尝试创建一个车工厂
/*Car car =new Baoma();
Car car1 =new Tsela();
car.name();
car1.name();*/
//于是我们就可以通过工厂拿到对应的车
Car baoma = CarFactory.getCar("宝马");
Car tsela = CarFactory.getCar("特斯拉");
baoma.name();
tsela.name();
}
}
public class CarFactory {
public static Car getCar(String car){
if (car.equals("宝马")){
return new Baoma();
}else if (car.equals("特斯拉")){
return new Tsela();
}else{
return null;
}
}
}
工厂方法模式
这个需要我们给每一个车品牌都创建一个工厂,虽然满足了开闭原则但是代码量却很多。
下面我先写了一个Car接口,然后写了两个类Baoma和Tsela实现Car接口
public class Consumer {
public static void main(String[] args) {
Car car = new BaomaFactory().getCar();
Car car1 = new TeslaFactory().getCar();
car.name();
car1.name();
}
}
public interface CarFactory { //CarFactory的总接口
Car getCar();
}
//---------------------------------------------------------------------------------------------------
public class BaomaFactory implements CarFactory { //宝马的工厂实现车工厂 因此只要从工厂调用方法就可以拿到对象
@Override
public Car getCar() {
return new Baoma();
}
}
工厂模式的应用场景
- JDK中Calendar的getInstance方法
- JDBC中connection对象的获取
- SpringIOC容器创建管理bean对象
- 反射中Class对象的newInstance方法
如何选用合适的工厂模式?
根据设计原则:我们会更偏向于工厂方法模式
根据实际而言:我们会更多的考虑简单工厂模式,应为他从各个方面的复杂度上来说都完胜工厂方法模式。