简单工厂模式:简单工模式时类的创建模式,又叫做静态工厂方法(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(); } }
配置文件:
简单工厂与其他设计模式的联系