zoukankan      html  css  js  c++  java
  • 简单工厂模式和抽象工厂模式

    1.简单工厂模式

    工厂模式定义了一个创建对象的接口,但由子类来决定要实例化的类是哪一个,工厂方法让类把实例化推迟到子类。

    常常听到做开发的同事说,工厂方法让子类决定要实例化的类是哪一个,这里所谓的‘’决定‘,并不是指模式允许子类本身在运行时做决定,而是值在编写创建者类时,不需要知道实际创建的产品是哪一个。选择了使用哪个子类,自然就决定了实际创建的产品是什么,说白了,程序的控制权是客户端。

     

    上图是简单工厂模式的UML图。

    简单工厂模式能够统一管理对象的生成,当业务改变时,不需要修改主干业务代码,但是需要修改工厂子类方法的实现(这也违反了开闭的原则),尽管如此,统一管理对象的生成能够减轻代码修改的工作量。另一个方面,如果不使用工厂模式,客户端的代码会依赖具体的产品实现,使用工厂模式,客户端依赖的是抽象的接口,会解耦客户端与具体产品之间的依赖,这也符合依赖抽象,不依赖具体类的原则。

    2.抽象工厂模式

     

    抽象工厂模式融合了产品族的概念,一个具体的工厂可以生产多种不同的产品,其可以解决简单工厂层次过多的问题。比如用简单工厂来生产枪,那么生产枪的工厂是一个层次,生产枪的过程中,需要子弹,那么在生产枪的过程中,还要定义一个子弹的工厂来生产子弹,这又是一个层次,但是生产子弹需要火药和金属,因此在生产子弹时,又要定义一个火药和金属的工厂,又产生了一个层次。但是采用抽象工厂模式,可以将以上的这些材料产生在一个相同的级别,一个抽象工厂的方法可以同时生产枪,子弹,火药和金属。

    3.用SOLID原则来审查工厂模式

    1.单一职责,简单工厂只有一个工厂方法,符合单一职责,但会增加上述所说的层次过多的问题。抽象工厂会有生产多种产品的方法,和单一职责有些背离,但会简化类层次。

    2.对修改关闭,对扩展开放。很显然,简单工厂和抽象工厂都违背了这个原则,当需要增加某种产品时,工厂方法都需要做修改。但如果只是增加产品族,那么抽象工厂模式符合不会违背这个原则。

    3.里式替换。显然工厂方法都定义返回值是抽象类或接口,符合里式替换原则。

    4.接口隔离。未体现这个原则

    5.依赖倒置。客户端程序和具体生产的产品都依赖产品的抽象,符合依赖倒置的原则。

  • 相关阅读:
    模拟实现ajax加载框
    京东晒单的js实现
    微信分享js代码(转载)
    css模拟实现selec下拉框
    网页端实现输入卡号四字隔开
    返回顶部的动态显示与隐藏
    js等比例缩放图片(转载)
    css模拟实现checkbox
    quartz的使用 Mr
    Spring声明式事务配置管理方法 Mr
  • 原文地址:https://www.cnblogs.com/CLFR/p/6390928.html
Copyright © 2011-2022 走看看