设计模式(2) ------- 工厂方法模式

设计模式(2) ——- 工厂方法模式

  • 上一篇关于简单工厂模式的介绍留了点小尾巴,对于简单工厂模式的缺点没有介绍。在这里首先讲一下,然后再利用它来引出 — 工厂方法模式(这算是上次偷懒的好借口吧 O(∩_∩)O~)
  • 上一篇 简单工厂模式

概述

  • 简单工厂模式的缺点

    简单厂模式的最大缺点 —— 不完全满足 OCP。OCP [开闭原则],其核心思想是:一个类对扩展开方,对修改关闭。说通俗点就是,如果再添加一个新的产品类,不需要修改原来的工厂类就可以正常运行。很明显,简单工厂模式是不满足的,若想保证整个的正常运行必须修改工厂类。

  • 工厂方法模式

    工厂方法模式与简单工厂模式的最大不同在于,简单工厂模式只有一个(对于一个项目或者一个独立模块而言)工厂类,而工厂方法模式有一组实现了相同接口(工厂接口)的工厂类。

  • 工厂方法模式的组成

    抽象工厂角色

    这是工厂方法模式的核心,它与应用程序无关,是具体工厂类必须实现的接口或继承的抽象类。

    具体工厂角色

    等同于简单工厂模式的。

    抽象产品角色

    它是具体产品继承的父类或者是实现的接口。

    具体产品角色

    等同于简单工厂模式的。

  • 工厂方法模式图示

    这里写图片描述

举例说明

  • 案例说明

    这里仍然使用简单工厂模式中的例子,具体内容可以去看一下上一篇。

  • 代码

    package 工厂方法;
    
    public interface Factory {
      球员 factory();
    }
    
    package 工厂方法;
    
    public class 篮球Factory implements Factory{
      @Override
      public 球员 factory() {
          return new 篮球球员();
      }
    }
    
    package 工厂方法;
    
    public class 足球Factory implements Factory{
      @Override
      public 球员 factory() {
          return new 足球球员();
      }
    }
    
    package 工厂方法;
    
    public interface 球员 {
      void 跑();
      void 跳();
    }
    
    package 工厂方法;
    
    public class 篮球球员 implements 球员{
      @Override
      public void 跑() {
          System.out.println("篮球球员,跑跑跑!");
      }
    
      @Override
      public void 跳() {
          System.out.println("篮球球员,跳跳跳!");
      }
    }
    
    package 工厂方法;
    
    public class 足球球员 implements 球员 {
      @Override
      public void 跑() {
          System.out.println("足球球员,跑跑跑!");
      }
    
      @Override
      public void 跳() {
          System.out.println("足球球员,跳跳跳!");
      }
    }

    说明:很明显,这里与简单工厂模式的不同在于这里添加了一个工厂接口。而且对于该接口有相应几个,每个对应不同产品类的具体工厂类。

    好处:假如现在添加乒乓球球员,在工厂方法模式下,只需要添加两个类即可。一个是乒乓球球员类,另一个是乒乓球Factory类【具体代码如下】。而在简单工厂模式下,就需要修改原来的工厂类了,这就不能满足 OCP 原则了。

    • 代码
    package 工厂方法;
    
    public class 乒乓球球员 implements 球员{
        @Override
        public void 跑() {
            System.out.println("乒乓球球员,跑跑跑!");
        }
    
        @Override
        public void 跳() {
            System.out.println("乒乓球球员,跳跳跳!");
        }
    }
    
    package 工厂方法;
    
    public class 乒乓球Factory implements Factory{
        @Override
        public 球员 factory() {
            return new 乒乓球球员();
        }
    }

总结(简单工厂模式与工厂方法模式比较)

  • 客户端编程难度

    工厂方法模式在工厂类结构中引入了接口,从而能满足 OCP 原则。但是在客户端编码中需要对工厂类进行实例化。而简单工厂模式的工厂类是个静态类,在客户端无需实例化,这无疑是个吸引人的优点。

  • 维护角度

    显然工厂方法模式较难维护,需要更改多个工厂类。

    综述:虽然工厂方法模式更“先进一些”,但总的来说简单工厂模式更好用、更方便些。当然,这只是个人见解。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值