创建者和调用者分离
用来生产统一等级结构中的任意产品(增加新的产品,需要修改已有代码)
1.定义一个产品接口
/* 产品接口 */ public interface Car { //方法 public void produce(); }2.创建产品的实现类,实现具体产品的生产
/* 产品的实现类 */ public class HongQI implements Car { @Override public void produce() { System.out.println("制作红旗"); } } /* 产品的实现类 */ public class BiYaDi implements Car { @Override public void produce() { System.out.println("制作比亚迪"); } }3.原有的方式需要了解接口和所有的实现类(不推荐)
/* 以前需要了解接口和所有的实现类! */ public class Consumer { public static void main(String[] args) { Car car =new HongQI(); Car car2 =new BiYaDi(); car.produce(); car2.produce(); } }4.创建工厂,根据传入参数的不同,调用不同的具体产品类(推荐)
/* 工厂 */ public class CarFactory { public static Car getCar(String car){ if (car.equals("HongQi")){ return new HongQI(); }else if (car.equals("BiYaDi")){ return new BiYaDi(); }else { return null; } } }5.用户直接调用工厂类的方法,只需要传入自己想要的产品就能确定生产哪样产品
/* 使用工厂创建 */ public class Consumer { public static void main(String[] args) { Car car = CarFactory.getCar("HongQi"); Car car2 = CarFactory.getCar("BiYaDi"); car.produce(); car2.produce(); } }优点:简单易操作,比较好理解。 缺点:违反了开闭原则,即当我们给类增加新功能时,尽量不修改代码。
工厂方法模式: -用来生产同一等级结构中的固定产品(支持增加任意产品)1.定义一个产品接口
/* 产品接口 */ public interface Car { //方法 public void produce(); }2.创建产品的实现类,实现具体产品的生产
/* 产品的实现类 */ public class HongQI implements Car { @Override public void produce() { System.out.println("制作红旗"); } } /* 产品的实现类 */ public class BiYaDi implements Car { @Override public void produce() { System.out.println("制作比亚迪"); } }3.定义一个工厂接口
/* 工厂接口 */ public interface CarFactory { Car getCar(); }4.工厂实现类
/* 工厂的实现类 */ public class HongQiFactory implements CarFactory { @Override public Car getCar() { return new HongQI(); } } /* 工厂的实现类 */ public class BiYaDiFactory implements CarFactory { @Override public Car getCar() { return new BiYaDi(); } }5.工厂方法模式
/* 工厂方法模式 */ public class Consumer { public static void main(String[] args) { Car car = new BiYaDiFactory().getCar(); Car car2 = new HongQiFactory().getCar(); car.produce(); car2.produce(); } }优点:满足开闭原则 缺点:结构复杂、代码复杂、编程复杂、管理复杂
总结:
按设计原则,工厂方法模式按实际业务,简单工厂模式