先介绍一下简单工厂模式,简单工厂不属于23种设计模式,其划分粒度比较大,类型多的情况下,扩展性差
public interface Car {
void run();
}
//比亚迪汽车
public class BydCar implements Car{
@Override
public void run() {
System.out.println("比亚迪汽车");
}
}
public class JiLiCar implements Car {
@Override
public void run() {
System.out.println("吉利汽车");
}
}
//汽车厂(4S店)
public class CarFactory {
public static Car createCar(String name){
if(name == null || "".equals(name)){
return null;
}
if(name.equals("比亚迪")){
return new BydCar();
}
if(name.equals("吉利")){
return new JiLiCar();
}
return null;
}
}
public class Client {
public static void main(String[] args) {
CarFactory.createCar("比亚迪").run();
CarFactory.createCar("吉利").run();
}
}
以上demo可以看出,每当我们需要新增一个车辆类型的时候就要再核心工厂类进行一次判断,扩展性很差,接下来介绍工厂方法。
工厂方法模式现实中使用的还是比较多的,多态性工厂模式,划分粒度要比简单工厂细一些,核心工厂类不再负责所有产品的创建,具体的创建工作交个子类去创建,核心类成为一个抽象工厂角色,仅负责给出具体工厂子类必须实现的接口。
public interface Car {
void run();
}
//比亚迪汽车
public class BydCar implements Car{
@Override
public void run() {
System.out.println("比亚迪汽车");
}
}
public class JiLiCar implements Car {
@Override
public void run() {
System.out.println("吉利汽车");
}
}
//汽车厂(4S店)
public inteface CarFactory {
void createCar();
}
public class BydFactory implements CarFactory{
@Override
public Car createCar() {
return new BydCar();
}
}
public class JiLiFactory implements CarFactory{
@Override
public Car createCar() {
return new JiLiCar();
}
}
public class Client {
public static void main(String[] args) {
CarFactory bydFactory = new BydFactory();
bydFactory.createCar().run();
CarFactory jiliFactory = new JiLiFactory();
jiliFactory.createCar().run();
}
}
以上demo可以看出,核心工厂类只定义了必要的方法,不做创建工作,这样我们就不需要每新增一个类型都要修改核心工厂类的代码,只需要创建一个实现该接口的实现类(或者如果定义成抽象类则继承它,由于java不支持多继承,所以建议使用接口方式),再通过该实现类进行初始化即可,大大的提高了扩展性。工厂方法模式由工厂帮助我们初始化对象,减少程序耦合性,有利于后期的维护。将选择实现类、创建对象统一管理和控制,从而将调用者和我们的实现类解耦。