分类:
1、简单工厂:可根据自变量的不同返回不同类的实例
应用:将类名和类的全路径放入到配置文件,通过文件流将内容读取放入到map集合中保存,通过反射读取类全路径读取到该类,然后调用类方法。
详细设计:
1、创建Product接口,定义name方法
2、创建Car和TV类实现Product接口并重写name方法
3、创建Product接口工厂,定义获取Car和TV的方法
4、创建Consumer消费者来获取对应对象
话不多说,直接上代码:
public interface Product { void name(); }
public class Car implements Product{ @Override public void name() { System.out.println("我是汽车!"); } }
public class TV implements Product{ @Override public void name() { System.out.println("我是电视机!"); } }
public class ProductFactory { public static Product getProduct(String name) { if ("Car".equalsIgnoreCase(name)) { return new Car(); } else if ("TV".equalsIgnoreCase(name)) { return new TV(); } else { return null; } } }
public class Consumer { public static void main(String[] args) { Product car = ProductFactory.getProduct("Car"); Product tv = ProductFactory.getProduct("TV"); car.name(); tv.name(); } }
输出结果:
我是汽车! 我是电视机!
简单工厂不好扩展,比如加个新商品空调,修改ProductFactory 类比较繁琐
此时引入了工厂方法
工厂方法
详细设计:
1、创建Product接口,定义name方法
2、创建Car和TV类实现Product接口并重写name方法
3、创建Car和TV接口工厂CarFactory和TVFactory,定义获取Car和TV的方法
4、创建Consumer消费者,通过各自的工厂来获取对应对象
如果再加个新商品,再建个空调Factory即可
工厂方法模式代码比较臃肿,不能满足精简代码的作用
抽象工厂模式
工厂的工厂
详细设计:
1、创建Car接口定义run方法 创建TV接口定义look方法 2、创建Audi和BMW类实现Car接口并重写run方法 创建LeTV和Sony类实现TV接口并重写look方法 3、创建Factory接口定义生产Car和TV的方法 4、创建FactoryA类并重写Car和TV方法,创建Audi和LeTV对象 创建FactoryB类并重写Car和TV方法,创建BWM和Sony对象 5、创建Consumer消费者,new FactoryA可以获取到对应的Audi和LeTV对象 创建Consumer消费者,new FactoryB可以获取到对应的BWM和Sony对象
场景:
有小米和华为两个厂商
各自工厂生产手机和路由器
手机和路由器有各自的功能
手机:打电话和发短信
路由器:打开和关闭Wifi
详细设计:
1、创建IPhoneProduct接口定义callUp和sendMsg方法 创建IRouterProduct接口定义openWifi和closeWifi方法 2、创建XiaomiPhone和HuaweiPhone类实现IPhoneProduct接口并重写对应方法 创建XiaomiRouter和HuaweiRouter类实现IRouterProduct接口并重写对应方法 3、创建IProductFactory接口定义生产Phone和Router的方法 4、创建XiaomiFactory类实现IProductFactory接口并重写Phone和Router的方法,创建XiaomiPhone和XiaomiRouter对象 创建HuaweiFactory类实现IProductFactory接口并重写Phone和Router的方法,创建HuaweiPhone和HuaweiRouter对象 5、创建Consumer消费者类,new XiaomiFactory可以获取到对应的phoneProduct和routerProduct对象 然后调用各自商品的方法