我需要一辆汽车,那我可以直接从工厂里面提货,而不用去管汽车是怎么做出来的,以及生产汽车的具体实现,我只需要告诉这个工厂要生产什么品牌的汽车就好,具体的汽车生产流水线我也不用管。
知道部分特性而创建具体对象的场景。
如:根据环境类型(dev,test或master等)直接调用一整套环境配置
优点:避免了许多无用的重复代码,统一由工厂类生成对象,便于代码管控和理解。

奥迪
/** * 奥迪车生产流水线 */ public class AudiLine extends CarFactory { @Override public void produceCar() { //实现生产流水线接口定义的方法,生产奥迪车 System.out.println("整台奥迪来开~"); } }
奔驰
/** * 奔驰车生产流水线 */ public class BenzLine extends CarFactory { @Override public void produceCar() { //实现生产流水线接口定义的方法,生产奔驰车 System.out.println("整台奔驰来开~"); } }
宝马
/** * 宝马车生产流水线 */ public class BmwLine extends CarFactory { @Override public void produceCar() { //实现生产流水线接口定义的方法,生产宝马车 System.out.println("整台宝马来开~"); } }
/** * 汽车生产工厂 */ public abstract class CarFactory { /** * 生产汽车的方法【抽象方法】 */ public abstract void produceCar(); /** * 获取对应的汽车生产线 * * @param carBrand * @return */ public CarFactory getCarFactory(String carBrand) throws Exception { if (carBrand == null) { return null; } if (carBrand.equalsIgnoreCase("bmw")) { //返回一个“宝马”的生产线 return new BmwLine(); } else if (carBrand.equalsIgnoreCase("benz")) { //返回一个“奔驰”的生产线 return new BenzLine(); } else if (carBrand.equalsIgnoreCase("audi")) { //返回一个“奥迪”的生产线 return new AudiLine(); } else { throw new Exception("没有对应品牌的生产线,无法生产!"); } } }
/** * 工厂模式测试类【模拟下单】 */ public class FactoryTest { public static void main(String[] args) throws Exception { //客户要买“宝马”车,工厂根据入参【需求】找到对应的生产线对象,并让他它生产汽车 CarFactory bmwLine = CarFactory.getCarFactory("bmw"); //调用“宝马”生产线的生产汽车方法 bmwLine.produceCar(); } }

原文:https://www.cnblogs.com/riches/p/11198488.html