工厂模式(不要为了设计模式而设计模式)
工厂模式的意义在于:建造和使用相分离。让子类自己去决定要使用哪一个工厂实现类。
工厂模式主要分为3种
- 简单工厂模式(又叫做静态工厂模式)
- 工厂方法模式
- 抽象工厂方法(在设计模式中它与工厂模式是同级的,当做另一个模式,本质上是工厂的工厂)
简单工厂模式
其实就是抽象出一个具体的工厂类,然后需要啥就从这个静态的工厂类中获得就好。但是它有一个不好的点就是违反了开闭原则,如果你需要新加一种产品,你就要改动这个工厂的代码。并且所有的获取对象都是在这个工厂之中,会造成代码臃肿。但是相对于工厂模式和抽象工厂模式来说,它实现起来比较方便一点,并且更难造成类爆炸。在工作中其实用到的还挺多的。
工厂方法模式
这个设计模式,满足了开闭原则。当产生一个新产品的时候,不需要去改动原来的代码,你只需要去实现你需要增加的产品和对应的产品工厂就行。
产品接口和工厂接口
public interface Car {
/**
* 车的名字
*
*
*/
void name();
}
public interface CarFactory {
Car getCar();
}
具体实现类
public class Tesla implements Car {
@Override
public void name() {
System.out.println("tesla");
}
}
public class TeslaFactory implements CarFactory {
@Override
public Car getCar() {
return new Tesla();
}
}
当你要实现一个新的产品:比如是大众,你所需要做的就是创建一个大众的工厂类去实现车工厂的接口,创建一个大众类去实现车的接口。不需要动任何原来的代码,满足开闭原则。但是它的类会越来越多。造成类爆炸。
抽象工厂模式
抽象工厂模式和工厂方法模式不同的点在于:抽象工厂又加了一层抽象,它将工厂又抽象出来一个总的工厂,需要你自己去决定使用哪一个具体的工厂。
可以看到相对于工厂方法模式来说,它的类进一步爆炸。
// 手机抽象
public interface IphoneProduct {
void open();
void call();
}
// 路由器抽象
public interface IRouterProduct {
void wifi();
}
// 工厂抽象
public interface IProductFactory {
IphoneProduct getPhone();
IRouterProduct getRouter();
}
// 华为工厂实现工厂接口 实现对应的方法
public class HuaweiFactory implements IProductFactory {
@Override
public IphoneProduct getPhone() {
return new Huaweiphone();
}
@Override
public IRouterProduct getRouter() {
return new HuaweiRouter();
}
}
// 华为手机产品
public class Huaweiphone implements IphoneProduct {
@Override
public void open() {
System.out.println("华为打开");
}
@Override
public void call() {
System.out.println("华为打电话");
}
}
// 华为路由器产品
public class HuaweiRouter implements IRouterProduct {
@Override
public void wifi() {
System.out.println("华为wifi工作");
}
}
我们可以看到,如果要创造一个新的产品,其实我们需要将工厂接口中再增加一种产品,需要动原来的代码,所以抽象工厂也是不符合开闭原则的。