工厂模式(factory pattern):即使用工厂方法来替代new的方式创建对象
工厂模式可分简单工厂和抽象工厂模式。
下面对这三种类型进行一一演示
1简单工厂模式
1)定义超类
public abstract class Car { public abstract void display(); //外观 }
2)子类
public class BMWCar extends Car { @Override public void display() { System.out.println("宝马车"); } }
public class AUTOCar extends Car { @Override public void display() { System.out.println("奥拓车"); } }
3)工厂类
public class CarFactory { public static Car getCar(String type) { if(StringUtils.isBlank(type)) throw new RuntimeException("参数异常"); else if("BMW".equals(type)) return new BMWCar(); else if("AUTO".equals(type)) return new AUTOCar(); return null; } }
4)测试
public static void main(String[] args){ CarFactory.getCar("BMW").display(); }
2、抽象工场模式
场景:比如现在宝马和奥拓有分中国产和德国产
1)超类
public abstract class Car { public abstract void display(); public static Car getCar(IFactory iFactory,String type) { return iFactory.getCar(type); } }
2)子类
public class CNAutoCar extends Car { @Override public void display() { System.out.println("中国产奥拓"); } }
public class CNBMWCar extends Car { @Override public void display() { System.out.println("中国产宝马"); } }
public class GMAutoCar extends Car{ @Override public void display() { System.out.println("德国产奥拓"); } }
public class GMBMWCar extends Car { @Override public void display() { System.out.println("德国产宝马"); } }
3)工厂类
public class CNCarFactory implements IFactory { @Override public Car getCar(String type) { if(StringUtils.isBlank(type)) throw new RuntimeException("参数异常"); if("BMW".equals(type)) return new CNBMWCar(); else if("AUTO".equals(type)) return new CNAutoCar(); return null; } }
public class GMCarFactoty implements IFactory { @Override public Car getCar(String type) { if(StringUtils.isBlank(type)) throw new RuntimeException("参数异常"); if("BMW".equals(type)) return new GMBMWCar(); else if("AUTO".equals(type)) return new GMAutoCar(); return null; } }
工厂模式中(也适用于所有设计模式),需要注意有个依赖抽象原则:
1)不要让变量持有具体类的引用
2)不要让类继承具体类,要继承抽象类或者实现接口
3)不要覆盖超类中已实现的方法,如果设计的超类中已实现的方法出现被子类覆盖的情况,说明该超类设计的不合理