简单工厂模式:简单工模式时类的创建模式,又叫做静态工厂方法(static Factory Method)。简单工厂模式是一个工厂对象决定创建出哪一种产品类的实例。它存在的目的很简单:定义一个创建对象的接口。简单工厂模式的最大优点在于工厂类中包含了必要的逻辑判断,根据客户端的选择条件动态实例化相关的类,对于客户端来说,去除了与具体产品的依赖。
工厂方法模式(Factory Method),定义一个用于创建对象的接口,让子类决定实例化哪一个类。工厂方法使一个类的实例化延迟到其子类。
抽象工厂模式(Abstract Factory),提供一个创建一系列相关或相互依赖对象的接口,而无需指定它们具体的类。
加反射和配置文件可以解决不符合开闭原则问题。
单产品:
不反射:简单工厂 好于 工厂方法
反射:简单工厂 好于 工厂方法
多产品:
不反射:抽象工厂(改) 好于 抽象工厂
反射:抽象工厂 好于 抽象工厂(改)
抽象工厂(改进)+反射+配置文件 实现制造汽车
- abstract class Benz {
- abstract void createCar();
- }
- public class GasBenz extends Benz{
- @Override
- void createCar() {
- System.out.println("生产燃油的Benz");
- }
- }
- public class ElectricBenz extends Benz{
- @Override
- void createCar() {
- System.out.println("生产电力的Benz");
- }
- }
-
-
- abstract class BYD {
- abstract void createCar();
- }
- public class GasBYD extends BYD {
- @Override
- void createCar() {
- System.out.println("生产燃油的BYD");
- }
- }
- public class ElectricBYD extends BYD{
- @Override
- void createCar() {
- System.out.println("生产电力的BYD");
- }
- }
- public class Car_making {
- public static Benz createBenz() throws ClassNotFoundException, InstantiationException, IllegalAccessException, IOException {
- InputStream is = Car_making.class.getClassLoader().getResourceAsStream("Brands.properties");
- Properties proper = new Properties();
- proper.load(is);
- String type = proper.getProperty("type");
- String className = "abstractFactory" + "." + type + "Benz";
- return (Benz) Class.forName(className).newInstance();
- }
-
- public static BYD createBYD() throws ClassNotFoundException, InstantiationException, IllegalAccessException, IOException {
- InputStream is = Car_making.class.getClassLoader().getResourceAsStream("Brands.properties");
- Properties proper = new Properties();
- proper.load(is);
- String type = proper.getProperty("type");
- String className = "abstractFactory" + "." + type + "BYD";
- return (BYD) Class.forName(className).newInstance();
- }
- }
- //测试类
-
- public class Test {
- public static void main(String[] args) throws ClassNotFoundException, InstantiationException, IllegalAccessException, IOException {
- Benz benz = Car_making.createBenz();
- benz.createCar();
-
- System.out.println("------------------");
- BYD byd = Car_making.createBYD();
- byd.createCar();
- }
- }
配置文件: