大话设计模式系列——工厂方法模式总结及与简单工厂的区别

emmm......之所以写这个系列,是因为想去进阶,感觉写自己代码不够精简,亢沉臃肿;想写好写优雅写优秀,却不知道是不是优秀,模棱两可的感觉;想去入手源码,却不知道从拿下手,又或者说看不懂,为什么这么写。所以想入手设计模式系列,当然这些理解或者示例代码是建立在《大话设计模式》——程杰著的基础之上的。感觉这本书还是值得推荐的_

如果你之前没有接触过工厂模式的话,建议你先看这篇:简单工厂模式

对于工厂模式来讲,工厂模式细分为:简单工厂,工厂方法模式,抽象工厂,本篇主要讲解工厂方法模式,以及与简单工厂模式的区别

先说结论:

简单工厂类似一种自己指挥别人作事情,而工厂方法模式则是自己做事情。

工厂方法模式相对于简单工厂模式来说前者对代码的浸入率更少,利于拓展

简单工厂模式:

在具体讲解之前,我们先来看一组UML图:

可以看出,简单工厂是通过一个含参的工厂方法可以实例化任何产品,逻辑都放到了工厂类中,而工厂类是起到了关键作用;因此,我们可以总结出来简单工厂的特点:

优点

  1. 通过简单工厂模式,我们实现了对象的创建和使用的分离 (创建是在工厂类创建的,使用时在客户端);
  2. 在增加新产品情况下无需修改客户端代码,提高了系统的灵活与拓展性; (好比我增加一个幂运算,可以不用修改客户端代码,只需添加响应的类以及在工厂类增加响应的方法);

缺点

  1. 工厂类承担的责任太重,模块与模块之间耦合,一旦工厂类出现问题,整个系统都瘫痪了;
  2. 由于在新增产品的时候,工厂类还需要修改,这就违反了开放——封闭原则(对扩展是开放的,而对修改是封闭的)

适用情况:一般用于小项目或者具体产品很少扩展的情况(这样工厂类才不用经常更改)。

正是由于简单工厂存在这样的缺点,所以我们引入了工厂方法模式

工厂方法模式

工厂方法的UML图

而工厂方法中,对于逻辑的处理放回到了客户端(让用户选择new实例),用户只需关注增加新产品的类。

优点

  1. 工厂方法模式就很好的减轻了工厂类的负担,把某一类/某一种东西交由一个工厂生产;
  2. 符合开放——封闭原则;

缺点

  1. 不适合处理产品族的情况;

工厂方法部分代码实现:

  1. 创建工厂接口

    public interface IFactory {
         MetaData createMetaData();
    }

     

  2. 具体实现类去实现这个接口

    //加法工厂
    public class IFactoryAdd implements IFactory {
        public MetaData createMetaData() {
            return new MetaDataAdd();
        }
    }
    //减法工厂
    public class IFactoryReduce implements IFactory {
        public MetaData createMetaData() {
            return new MetaDataReduce();
        }
    }
    //乘法工厂
    public class IFactoryMul implements IFactory {
        @Override
        public MetaData createMetaData() {
            return new MetaDataMul();
        }
    }
    //除法工厂
    public class IFactoryDivision implements IFactory {
        @Override
        public MetaData createMetaData() {
            return new MetaDataDivision();
        }
    }

     

  3. 客户端实现

    public class FactoryMethod {
        public static void main(String[] args) {
            IFactory factoryAdd = new IFactoryAdd();
            MetaData addMetaData = factoryAdd.createMetaData();
            String result = addMetaData.getResult(1, 2);
            System.out.println("最终结果为:"+result);
    
        }
    }

总结

 简而言之,工厂方法模式与简单工厂模式的区别在于前者对代码的浸入率更少,利于拓展。

 

如果不使用工厂模式的话,也许代码会少很多——只需要处理业务逻辑,不使用封装多态继承。但是在后期可维护性上以及可扩展性上是非常差的,非常不灵活。所以我们还得多思考,优化代码。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值