定义

定义了一个创建对象的抽象方法,由子类决定要实例化的类。工厂方法模式将对象的实例化推迟到子类
核心本质:

  • 实例化对象不使用new, 用工厂方法代替
  • 将选择实现类, 创建对象统一管理和控制. 从而将调用者跟我们的实现类解耦

作用:实现了创建者和调用者的分离
详细分类:

  1. - 简单工厂模式 :用来生产统一等级结构中的任意产品(对于增加新的产品,需要覆盖已有代码)
  2. - 工厂方法模式 :用来生产同一等级结构中的固定产品(支持增加任意产品)
  3. - 抽象工厂模式 :围绕一个超级工厂创建其他工厂, 该超级工厂又称为其他工厂的工厂

优缺点

优点

  • 良好的封装性、代码结构清晰
  • 扩展性好。如果想增加一个产品,只需扩展一个工厂类即可
  • 典型的解耦框架
  • 屏蔽产品类。调用者只关心产品的接口

    缺点

  • 每增加一个产品,就需要增加一个产品工厂的类,增加了系统的复杂度

    使用场景

    (1)需要生成对象的地方。
    (2)需要灵活的、可扩展的框架。
    (3)数据库访问、数据库可能变化时。
    应用实例:

    • 需要一辆汽车,直接从工厂里面提货,不用去管这辆车是怎么做出来的。
    • hibernate换数据库只需换方言和驱动即可。
    • 简单计算器的实现。

      工厂模式实现方法

      1.简单工厂模式

      车:
      1. public interface Car {
      2. void name();
      3. }
      汽车品牌: ```java //特斯拉 public class Tesla implements Car { public void name() { System.out.println(“特斯拉”); } }

———————————————————————————————————————————————————————————————————— //五菱宏光 public class WuLing implements Car { public void name() { System.out.println(“五菱宏光”); } }

  1. 车工厂:
  2. ```java
  3. public class CarFactory {
  4. //静态工厂模式
  5. //增加一个新的产品如果不修改代码做不到
  6. //方法一
  7. public static Car getCar(String car){
  8. if (car.equals("五菱宏光")){
  9. return new WuLing();
  10. }else if(car.equals("特斯拉")){
  11. return new Tesla();
  12. }else return null;
  13. }
  14. //方法二
  15. public static Car getWuLing(){
  16. return new WuLing();
  17. }
  18. public static Car getTesla(){
  19. return new Tesla();
  20. }
  21. }

消费者按需调用:

  1. public class Consumer {
  2. public static void main(String[] args) {
  3. //接口,所有实现类
  4. Car wuLing = new WuLing();
  5. Car tesla = new Tesla();
  6. wuLing.name();
  7. tesla.name();
  8. wuLing=CarFactory.getCar("五菱宏光");
  9. tesla=CarFactory.getCar("特斯拉");
  10. wuLing.name();
  11. tesla.name();
  12. }
  13. }

对于增加新的产品, 需要覆盖已有代码!

2.工厂方法模式

2.工厂模式 - 图1

车&车工厂

  1. //车
  2. public interface Car {
  3. void name();
  4. }
  5. --------------------------------------------------------------------
  6. //车工厂CarFactory
  7. public interface CarFactory {
  8. //工厂方法模式
  9. Car getCar();
  10. }

品牌1:特斯拉&特斯拉工厂

  1. public class Tesla implements Car {
  2. public void name() {
  3. System.out.println("特斯拉");
  4. }
  5. }
  6. --------------------------------------------------------------------
  7. public class TeslaFactory implements CarFactory {
  8. public Car getCar() {
  9. return new Tesla();
  10. }
  11. }

品牌2:五菱&五菱工厂

  1. public class WuLing implements Car {
  2. public void name() {
  3. System.out.println("五菱宏光");
  4. }
  5. }
  6. ----------------------------------------------------------------
  7. public class WuLingFactory implements CarFactory {
  8. public Car getCar() {
  9. return new WuLing();
  10. }
  11. }

消费者按需调用

  1. public class Consumer {
  2. public static void main(String[] args) {
  3. //接口,所有实现类
  4. Car wuLing = new WuLingFactory().getCar();
  5. Car tesla = new TeslaFactory().getCar();
  6. wuLing.name();
  7. tesla.name();
  8. }
  9. //结构复杂度: simple
  10. //代码复杂度: simple
  11. //编程复杂度: simple
  12. //管理上的复杂度: simple
  13. //根据设计原则:工厂方法模式!
  14. //根据实际业务:简单工厂模式!
  15. }

3.抽象工厂模式

定义了一个接口用于创建相关或有依赖关系的对象族(对象的接口),而无需明确指定具体类
适用场景:

  • 客户端(应用层)不依赖于产品类实例如何被创建、实现等细节
  • 强调一系列相关的产品对象(属于同一产品族)一起使用创建对象需要大量的重复代码
  • 提供一个产品类的库,所有的产品以同样的接口出现,从而使得客户端不依赖于具体的实现

优点:

  1. - 具体产品在应用层的代码隔离,无需关心创建的细节
  2. - 将一个系列的产品统一到一起创建

缺点:

  1. - 规定了所有可能被创建的产品集合,产品簇中扩展新的产品困难;

应用实例:

  1. - JDKCalendargetInstance方法
  2. - JDBC中的Connection对象的获取
  3. - SpringIOC容器创建管理bean对象
  4. - 反射中Class对象的newstance方法

2.工厂模式 - 图2
2.工厂模式 - 图3
实例
**
2.工厂模式 - 图4

产品族1:手机(PhoneProduct)

  1. //手机产品接口
  2. public interface PhoneProduct {
  3. void start();
  4. void shutdown();
  5. void call();
  6. void sendMsg();
  7. }

产品族2:路由器(RouterProduct)

  1. //路由器产品接口
  2. public interface RouterProduct {
  3. void start();
  4. void shutdown();
  5. void openWifi();
  6. void setting();
  7. }

产品工厂(总)ProductFactory

  1. //抽象产品工厂,规定好了生成哪些产品族群
  2. public interface ProductFactory {
  3. //生产手机
  4. PhoneProduct phoneProduct();
  5. //生产路由器
  6. RouterProduct routerProduct();
  7. }

不同品牌的手机产品 XiaomiPhone/XuaweiPhone/…

  1. //小米手机
  2. public class XiaomiPhone implements PhoneProduct {
  3. @Override
  4. public void start() {
  5. System.out.println("小米开机");
  6. }
  7. @Override
  8. public void shutdown() {
  9. System.out.println("小米关机");
  10. }
  11. }
  12. -----------------------------------------------------------------------
  13. //华为手机
  14. public class HuaweiPhone implements PhoneProduct {
  15. @Override
  16. public void start() {
  17. System.out.println("华为开机");
  18. }
  19. @Override
  20. public void shutdown() {
  21. System.out.println("华为关机");
  22. }
  23. @Override
  24. public void call();{
  25. System.out.println("华为打电话");
  26. }
  27. }

不同品牌的路由器产品 XiaomiRouter/TP-Link Router/…

  1. //小米路由器
  2. public class XiaomiRouter implements RouterProduct {
  3. @Override
  4. public void start() {
  5. System.out.println("小米开启路由器");
  6. }
  7. @Override
  8. public void shutdown() {
  9. System.out.println("小米关闭路由器");
  10. }
  11. @Override
  12. public void openWifi() {
  13. System.out.println("小米开启Wifi");
  14. }
  15. @Override
  16. public void setting() {
  17. System.out.println("小米设置路由器");
  18. }
  19. }
  20. --------------------------------------------------------------------------------
  21. //TP-Link 路由器
  22. public class TP-LinkRouter implements RouterProduct {
  23. @Override
  24. public void start() {
  25. System.out.println("TP-Link开启路由器");
  26. }
  27. @Override
  28. public void shutdown() {
  29. System.out.println("TP-Link关闭路由器");
  30. }
  31. @Override
  32. public void openWifi() {
  33. System.out.println("TP-Link开启Wifi");
  34. }
  35. @Override
  36. public void setting() {
  37. System.out.println("TP-Link设置路由器");
  38. }
  39. }

小米工厂 XiaomiFactory (继承产品工厂已有的产品线,加工为小米自己品牌的产品)

  1. public class XiaomiFactory implements ProductFactory {
  2. @Override
  3. public PhoneProduct phoneProduct() {
  4. return new XiaomiPhone();
  5. }
  6. @Override
  7. public RouterProduct routerProduct() {
  8. return new XiaomiRouter();
  9. }
  10. }

华为工厂 HuaweiFactory (继承产品工厂已有的产品线,加工为华为自己品牌的产品)

  1. public class HuaweiFactory implements ProductFactory {
  2. @Override
  3. public PhoneProduct phoneProduct() {
  4. return new HuaweiPhone();
  5. }
  6. }

TP-Link 工厂 TP-LinkFactory (继承产品工厂已有的产品线,加工为TP-Link自己品牌的产品)

  1. public class TP-LinkFactory implements ProductFactory {
  2. @Override
  3. public RouterProduct routerProduct() {
  4. return new TP-LinkRouter();
  5. }
  6. }

消费者按需调用

  1. public class Client {
  2. public static void main(String[] args) {
  3. System.out.println("=================小米系列产品==============");
  4. XiaomiFactory xiaomiFactory = new XiaomiFactory();
  5. PhoneProduct phoneProduct = xiaomiFactory.PhoneProduct();
  6. PhoneProduct.start();
  7. RouterProduct routerProduct = xiaomiFactory.RouterProduct();
  8. routerProduct.start();
  9. System.out.println("=================华为系列产品==============");
  10. HuaweiFactory huaweiFactory = new HuaweiFactory();
  11. IPhoneProduct phoneProduct2 = huaweiFactory.PhoneProduct();
  12. phoneProduct.start();
  13. System.out.println("=================TP-Link系列产品==============");
  14. TP-LinkFactory tp-LinkFactory = new TP-LinkFactory();
  15. RouterProduct routerProduct2 = tp-LinkFactory.RouterProduct();
  16. routerProduct2.start();
  17. }
  18. }
  19. 运行结果:
  20. =================小米系列产品==============
  21. 小米开机
  22. 小米开启路由器
  23. =================华为系列产品==============
  24. 华为开机
  25. =================TP-Link系列产品==============
  26. TP-Link开启路由器