设计模式之工厂模式
一、工厂模式是什么?
工厂模式根据名字就可以理解出是生产某些东西用的。在写代码的过程中一般使用工厂模式来解耦,将类的创建和使用分开,类的管理和创建交给工厂去做,业务代码中使用工厂去获取类。常见的工厂模式例如Spring中的BeanFactory
工厂模式分为简单工厂模式、工厂方法模式和抽象工厂模式。
二、详细分析
1.简单工厂模式
简单工厂模式: 简单工厂模式是工厂类似于卖车商家,要啥车去找卖车商家去买,然后商家去不同的车企提车。
//车
public interface Car {
void make();
}
//奥迪
public class Audi implements Car{
public Audi(){
this.make();
}
@Override
public void make(){
/*制造奥迪车*/
}
}
public class BMW implements Car{
public BMW(){
this.make();
}
@Override
public void make() {
/*制造宝马车*/
}
}
造车的工厂
public class CarFactory {
public Car makeCar(String carType){
switch (carType){
case "audi":
return new Audi();
case "BMW":
return new BMW();
default:
return null;
}
}
}
具体使用:
public static void main(String[] args) {
CarFactory factory = new CarFactory();
/*造宝马车*/
Car bmw = factory.makeCar("BMW");
/*造奥迪车*/
Car audi = factory.makeCar("audi");
}
简单工厂模式代码逻辑比较简单,理解起来也比较容易,但是它违反了设计模式最基本的原则-开闭原则,对扩展开放,对修改关闭,也就是我们在造车的时候每增加一种车的类型就要去修改一下造车工厂,这修改了工厂的源码,破坏了开闭原则,这样会造成一种情况,可能后面新增加一个车的时候写的不安全把前面的造成也都影响了。
2.工厂方法模式
针对简单工厂模式的问题我们想了个解决方案就是每个车都建立自己的工厂,相互之间隔离互不干扰,所以需要个接口代表建造车工厂的固定模板(同类型的建筑设计应该差不多),然后按照模板分别建立两个工厂,每个工厂建立的细节自行实现,这就形成了工厂方法模式。
工厂方法模式: 工厂方法模式是随着时间的发展每个汽车有了自己的4S店。
//造车工厂
public interface CarFactory {
Car makeCar();
}
//奥迪造车厂
public class AudiFactory implements CarFactory{
@Override
public Car makeCar() {
return new Audi();
}
}
//宝马造车厂
public class BWMFactory implements CarFactory{
@Override
public Car makeCar() {
return new BWM();
}
}
使用:
public static void main(String[] args) {
/*造奥迪*/
CarFactory audiFactory = new AudiFactory();
audiFactory.makeCar();
/*造宝马*/
CarFactory bwmFactory = new BWMFactory();
bwmFactory.makeCar();
}
3.抽象工厂模式
现在造汽车的市场可能已经饱和了,我们要考虑向其他行业或者产品扩展了,所以我们又扩充了其他行业的生产线,这就是抽象工厂模式,它是简单工厂模式和工厂方法模式的结合。同样它肯定也是破坏开闭原则的,增加个生产线将所有代码都修改了一遍。
抽象工厂模式: 抽象工厂模式是汽车厂商看摩托车市场挺大的,也想造摩托车了。有可能我们复制一遍代码出了个摩托工厂,但是使用抽象工厂模式是在原来的工厂也造摩托车。
public interface CarFactory {
//造车
Car makeCar();
//造摩托
Motor makeMotor();
}
public class AudiFactory implements CarFactory{
@Override
public Car makeCar() {
return new Audi();
}
@Override
public Motor makeMotor(){
return new AudiMotor();
}
}
public class BWMFactory implements CarFactory{
@Override
public Car makeCar() {
return new BWM();
}
@Override
public Motor makeMotor(){
return new BWMMotor();
}
}
总结
优点:
将实例化对象的代码提取出来,放到一个类中统一管理和维护,达到和主项目的依赖关系的解耦。从而提高项 目的扩展和维护性。
缺点:
使用工厂模式需要大量的工厂和车,代码的开发量比较大。一般按照实际情况选择性使用。