工厂模式

    科技2025-04-03  15

    文章目录

    概述简单工厂模式工厂方法模式抽象工厂模式反射工厂

    概述

    满足OOP七大原则中: 开闭原则依赖倒置法则迪米特法则

    枚举工厂的实现

    简单工厂模式

    类接口 public interface Car { void name(); } 实现类 public class Audi implements Car { @Override public void name() { System.out.println("Audi"); } } public class Auto implements Car { @Override public void name() { System.out.println("Auto"); } } 工厂类 public class CarFactory { public static Car getAudi(){ return new Audi(); } public static Car getAuto(){ return new Auto(); } } 直接调用 public class Test { public static void main(String[] args) { CarFactory.getAudi().name(); CarFactory.getAuto().name(); } } 总结:不满足闭合原则(对扩展开放,对修改关闭),新增加实现类,需修改工厂类。

    工厂方法模式

    在简单工厂模式的基础上,再抽象出工厂接口,每个实现类设置自己的工厂。CarFactory public interface CarFactory { Car getCar(); } 工厂实现类 public class AudiFactory implements CarFactory { @Override public Car getCar() { return new Audi(); } } public class AutoFactory implements CarFactory { @Override public Car getCar() { return new Auto(); } } 测试类 public class Test { public static void main(String[] args) { new AudiFactory().getCar().name(); new AutoFactory().getCar().name(); } } 总结:工厂方法模式虽然满足设计原则,但复杂度更高;简单工厂模式更符合实际业务的选择。

    抽象工厂模式

    产品接口 public interface PhoneProuct { void start(); void shutDown(); void call(); void sendMsg(); } public interface RouterProduct { void start(); void shutDown(); void openWifi(); void setting(); } 产品品牌的实现类 public class XiaoMiPhone implements PhoneProuct { @Override public void start() { System.out.println("小米开机"); } @Override public void shutDown() { System.out.println("小米关机"); } @Override public void call() { System.out.println("小米打电话"); } @Override public void sendMsg() { System.out.println("小米发短信"); } } public class XiaoMiRouter implements RouterProduct { @Override public void start() { System.out.println("小米路由器开机"); } @Override public void shutDown() { System.out.println("小米路由器关机"); } @Override public void openWifi() { System.out.println("小米路由器打开wifi"); } @Override public void setting() { System.out.println("小米路由器发短信"); } } public class HuaWeiPhone implements PhoneProuct { @Override public void start() { System.out.println("华为开机"); } @Override public void shutDown() { System.out.println("华为关机"); } @Override public void call() { System.out.println("华为打电话"); } @Override public void sendMsg() { System.out.println("华为发短信"); } } public class HuaWeiRouter implements RouterProduct { @Override public void start() { System.out.println("华为路由器开机"); } @Override public void shutDown() { System.out.println("华为路由器关机"); } @Override public void openWifi() { System.out.println("华为路由器打开wifi"); } @Override public void setting() { System.out.println("华为路由器发短信"); } } 抽象工厂 public interface ProductFactory { //生产手机和路由器的工厂 PhoneProuct phoneProuct(); RouterProduct routerProduct(); } 品牌工厂实现类 public class XiaoMiFactory implements ProductFactory { @Override public PhoneProuct phoneProuct() { return new XiaoMiPhone(); } @Override public RouterProduct routerProduct() { return new XiaoMiRouter(); } } public class HuaWeiFactory implements ProductFactory { @Override public PhoneProuct phoneProuct() { return new HuaWeiPhone(); } @Override public RouterProduct routerProduct() { return new HuaWeiRouter(); } }

    反射工厂

    汽车工厂 public class IcarFactory { private IcarFactory(){} private Icar icar; private static Properties properties; static { properties = new Properties(); InputStream resourceAsStream = IcarFactory.class.getClassLoader().getResourceAsStream("car.properties"); try { properties.load(resourceAsStream); } catch (IOException e) { e.printStackTrace(); } } // 反射产生实例 public static Icar getCar(String carName){ String clazz = properties.getProperty(carName); try { Class<?> aClass = Class.forName(clazz); return (Icar) aClass.newInstance(); } catch (ClassNotFoundException e) { return null; } catch (IllegalAccessException e) { e.printStackTrace(); } catch (InstantiationException e) { e.printStackTrace(); } return null; } } car.properties bmw=com.javasm.factory.BMW benz=com.javasm.factory.BENZ Icar模板 public interface Icar { void run(); void stop(); }

    Processed: 0.010, SQL: 8