作用
实现了创建者和调用者分离详细分类 简单工厂模式 工厂方法模式 抽象工厂模式 OOP七大原则 开闭原则: 对扩展开放,对修改关闭 依赖倒置原则: 面向接口编程,不要面向实现编程 迪米特法则: 只与你的直接朋友交谈,不跟陌生人说话核心本质
实例化对象不使用new,用工厂方法代替将选择实现类,创建对象统一管理和控制,从而将调用者跟我们的实现类解耦三种模式
简单工厂模式 用来生产同一等级结构中的任意产品(对于增加新的产品,需要求该已有代码)工厂方法模式 用来生产同一等级结构中的固定产品(支持增加任意的产品)抽象工厂模式 围绕一个超级工厂创建其他工厂,该超级工厂又称为其他工厂的工厂代码演示:
接口部分:
public interface Car { void name(); }车辆部分:
package com.qiu.factory.simple; public class Tesla implements Car{ @Override public void name() { System.out.println("特斯拉!"); } } package com.qiu.factory.simple; public class WuLing implements Car{ @Override public void name() { System.out.println("五菱宏光!"); } }简单工厂实现:
package com.qiu.factory.simple; public class CarFactory { //这就是静态工厂模式 //车工厂 : 方法一 public static Car getCar(String car){ if (car.equals("五菱")){ return new WuLing(); } if (car.equals("特斯拉")){ return new Tesla(); } return null; } //方法二 public static Car getWuLing(){ return new WuLing(); } public static Car getTesla(){ return new Tesla(); } }这种就是简单的工厂模式,但是有个小问题就是我们在增加车辆的时候需要对源码进行修改,所以需要进行改进
改进:工厂方法模式
Car:
package com.qiu.factory.method; public interface Car { void name(); }CarFactory:
package com.qiu.factory.method; /** * //工厂方法模式 * @author qiuzhikang */ public interface CarFactory { Car getCar(); }tesla:
package com.qiu.factory.method; public class Tesla implements Car { @Override public void name() { System.out.println("特斯拉!"); } }TeslaFactory:
package com.qiu.factory.method; public class TeslaFactory implements CarFactory{ @Override public Car getCar() { return new Tesla(); } }consumer:
package com.qiu.factory.method; /** * @author qiuzhikang */ public class Consumer { public static void main(String[] args) { Car car = new WuLingFactory().getCar(); Car car1 = new TeslaFactory().getCar(); car.name(); car1.name(); Car car2 = new MoBaiFactory().getCar(); car2.name(); } } 结构复杂度: simple代码复杂度: simple编程复杂度: simole管理上的复杂度: simple总结:
根据设计原则:工厂方法原则根据实例业务:简单工厂模式结构图: 部分代码:
接口部分:
package com.qiu.factory.abstract1; /** * 抽象产品工厂 * @author qiuzhikang */ public interface IProductFactory { //生产手机 IphoneProduct iphoneProduct(); //生产路由器 IRoutePruduct routerProduct(); } package com.qiu.factory.abstract1; /** * 手机产品接口 * @author qiuzhikang */ public interface IphoneProduct { void start(); void shotdown(); void callup(); void sendSMS(); } package com.qiu.factory.abstract1; /** * 路由器产品接口 * @author qiuzhikang */ public interface IRoutePruduct { void start(); void shotdown(); void openwife(); void setting(); }实现部分:
package com.qiu.factory.abstract1; /** * 华为工厂 * @author qiuzhikang */ public class HuaweiFactory implements IProductFactory{ @Override public IphoneProduct iphoneProduct() { return new HuaweiProduct(); } @Override public IRoutePruduct routerProduct() { return new HuaweiRouter(); } } package com.qiu.factory.abstract1; public class HuaweiProduct implements IphoneProduct{ @Override public void start() { System.out.println("华为手机开机"); } @Override public void shotdown() { System.out.println("华为手机关机"); } @Override public void callup() { System.out.println("华为手机打电话"); } @Override public void sendSMS() { System.out.println("华为手机发短信"); } } package com.qiu.factory.abstract1; public class HuaweiRouter implements IRoutePruduct{ @Override public void start() { System.out.println("华为路由器开机"); } @Override public void shotdown() { System.out.println("华为路由器关机"); } @Override public void openwife() { System.out.println("华为路由器开启wifi"); } @Override public void setting() { System.out.println("华为路由器设置"); } }客户部分:
package com.qiu.factory.abstract1; public class Client { public static void main(String[] args) { System.out.println("小米系列产品=================="); XiaomiFactory xiaomiFactory = new XiaomiFactory(); IphoneProduct iphoneProduct = xiaomiFactory.iphoneProduct(); iphoneProduct.callup(); iphoneProduct.sendSMS(); IRoutePruduct iRoutePruduct = xiaomiFactory.routerProduct(); iRoutePruduct.openwife(); iphoneProduct.sendSMS(); System.out.println("华为系列产品=================="); HuaweiFactory huaweiFactory = new HuaweiFactory(); IphoneProduct iphoneProduct1 = huaweiFactory.iphoneProduct(); iphoneProduct1.sendSMS(); iphoneProduct1.callup(); IRoutePruduct iRoutePruduct1 = huaweiFactory.routerProduct(); iRoutePruduct1.openwife(); iRoutePruduct1.setting(); } }小米产品同上一致
工厂模式和抽象工厂模式小结
小结:
简单工厂模式(静态工厂模式) 虽然某种程度上不符合设计原则,但是实际使用最多工厂方法模式 不可以修改已有类的前提下,通过增加新的工厂类实现扩展抽象工厂模式 不可以增加产品,可以增加产品族应用场景
JDK中的Calendar 的getInstance()方法JDBC中的Connection对象的获取spring中ioc容器创建管理bean对象反射中Class对象的newInstance