分类:
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对象
然后调用各自商品的方法