抽象工厂模式(Abstract Factory Pattern)是围绕一个超级工厂创建其他工厂。该超级工厂又称为其他工厂的工厂。这种类型的设计模式属于创建型模式,它提供了一种创建对象的最佳方式。
在抽象工厂模式中,接口是负责创建一个相关对象的工厂,不需要显式指定它们的类。每个生成的工厂都能按照工厂模式提供对象。
就是把工厂模式的Factory再抽象一层,用来创建各种各样的工厂。
使用场景: 1、QQ 换皮肤,一整套一起换。 2、生成不同操作系统的程序。
注意事项**:产品族难扩展,产品等级易扩展。
接着工厂模式代码, 现在汽车的窗户也是接口,可以由不同的厂家来生成汽车的窗户。如A厂家 B厂家
public interface CarWindow {void run();}public class ACarWindow implements CarWindow{public void run() {System.out.println("A 品牌的窗户!");}}public class BCarWindow implements CarWindow{public void run() {System.out.println("B 品牌的窗户!");}}
然后再抽象一个抽象工厂出来,来生产不同的工厂,汽车工厂和汽车窗户工厂。
public abstract class AbstractFatory {public abstract CarWindow getCarWindow(int type);public abstract Car getCar(int type);}public class CarFactory2 extends AbstractFatory{public CarWindow getCarWindow(int type) {return null;}/*** carType可以写在配置文件中 用枚举代替* @param carType*/public Car getCar(int carType){Car car = null;if(carType == CarEnum.BT_CAR.getVal()){car = new BTCar();}else if(carType == CarEnum.BM_CAR.getVal()){car = new BMCar();}else if(carType == CarEnum.BZ_CAR.getVal()){car = new BZCar();}return car;}}public class CarWindowFactory extends AbstractFatory {public CarWindow getCarWindow(int windowType) {CarWindow carWindow = null;if(windowType == 1){carWindow = new ACarWindow();}else if(windowType == 2){carWindow = new BCarWindow();}return carWindow;}public Car getCar(int carType) {return null;}}
然后再有不同的实现来生产具体的工厂
public class FactoryProducer {public static AbstractFatory getFactory(String choice){if(choice.equalsIgnoreCase("CAR")){return new CarFactory2();} else if(choice.equalsIgnoreCase("WINDOW")){return new CarWindowFactory();}return null;}}
启动测试主函数
public static void main(String[] args) {AbstractFatory carFactory = FactoryProducer.getFactory("CAR");carFactory.getCar(1).run();AbstractFatory windowFactory = FactoryProducer.getFactory("WINDOW");windowFactory.getCarWindow(1).run();}
总结:就是工厂模式使用的时候,一个大的工厂可以代替生产窗户 ,坐垫,椅子 等等其他的小的工厂。使用一个工厂就可以解决。
