工厂模式(new对象不需要关注对象需要的参数,直接从工厂获取对象)
消费者不使用new 对象创建实例,而直接获取 工厂创建的对象
有三种:简单工厂,方法工厂,超级工厂
简单工厂(使用多,简单易读,但需要新的类对象时,需要修改工厂原有的代码)
一个工厂使用static静态方法创建不同对象,消费者通过一个工厂获取需要的对象
public class 汽车工厂 { public static 汽车 getCar(String car){ if(car.equals("五菱宏光")){ return new 五菱宏光(); }else if(car.equals("特斯拉")){ return new 特斯拉(); }else { return null; } } }
public class 消费者 { public static void main(String[] args) { //new对象不需要关注对象需要的参数 汽车 汽车1 = 汽车工厂.getCar("五菱宏光"); 汽车 汽车2 = 汽车工厂.getCar("特斯拉"); 汽车1.name(); 汽车2.name(); } }
方法工厂(更符合设计原则,不会改变工厂原有的代码,每多一个需要的类对象,就多一个工厂)
通过不同的工厂创建不同的对象,消费者通过不同的工厂获取不同的对象
public class 五菱宏光工厂 implements 汽车工厂 { @Override public 汽车 getCar() { return new 五菱宏光(); } }
public class 特斯拉工厂 implements 汽车工厂 { @Override public 汽车 getCar() { return new 特斯拉(); } }
public class 消费者 { public static void main(String[] args) { 汽车 car1 = new 五菱宏光工厂().getCar(); 汽车 car2 = new 特斯拉工厂().getCar(); car1.name(); car2.name(); } }
抽象工厂(可以增加产品族(品牌),添加新的产品代码修改复杂,不易理解,适用于稳定代码)
工厂继承抽象工厂,不同生产商工厂 各自实现 生产自身品牌不同类型产品(手机,路由器,笔记本)的方法, 修改抽象工厂添加新的产品,所有的子工厂都要修改自身的实现
小米工厂 继承工厂 生产小米手机,小米路由器,小米笔记本
华为工厂 继承工厂 生产华为手机,华为路由器,华为笔记本
public class 小米工厂 implements 抽象工厂{ @Override public 抽象手机 getPhone() { return new 小米手机(); } @Override public 抽象路由器 getRouter() { return new 小米路由器(); } }
public class 消费者 { public static void main(String[] args) { 抽象手机 华为手机 = new 华为工厂().getPhone(); 华为手机.打电话(); 华为手机.玩游戏(); 华为手机.联网(); 抽象手机 小米手机 = new 小米工厂().getPhone(); 小米手机.打电话(); 小米手机.玩游戏(); 小米手机.联网(); 抽象路由器 小米路由器 = new 小米工厂().getRouter(); 小米路由器.联网(); } }