zoukankan      html  css  js  c++  java
  • 创建型模式-工厂模式

    一、引言

    在面向对象编程中, 最通常的方法是一个new操作符产生一个对象实例,new操作符就是用来构造对象实例的。但是在一些情况下, new操作符直接生成对象会带来一些问题。举例来说, 许多类型对象的创造需要一系列的步骤: 你可能需要计算或取得对象的初始设置; 选择生成哪个子对象实例; 或在生成你需要的对象之前必须先生成一些辅助功能的对象。 在这些情况,新对象的建立就是一个 “过程”,不仅是一个操作,像一部大机器中的一个齿轮传动。
    模式的问题:如何轻松构建对象,而不必关心创建对象的细节和复杂过程。 
    解决方案:建立一个工厂来创建对象。它为创建对象提供过渡接口,以便将创建对象的具体过程屏蔽起来,提高灵活性。
     

    二、分类

    工厂模式可以分类三类:
    (1)简单工厂模式 simple factory
    (2)工厂方法模式:factory method
    (3)抽象工厂模式:abstract factory

    三、区别

    (1)简单工厂模式:一个工厂类,可以获取多个产品类实例。
    (2)工厂方法模式:
    一个抽象产品类,可以派生多个具体产品类。
    一个抽象工厂类,可以派生多个具体工厂类。
    每个具体工厂类派生一种产品类。
    (3)抽象工厂模式:
    多个抽象产品类,可以派生多个具体产品类。
    一个抽象工厂类,可以派生多个具体工厂类。
    每个具体工厂类可以创建多个具体产品类的实例。
    工厂方法模式和抽象工厂模式的区别:
    一个抽象产品类 VS 多个抽象产品类 ;
    每个具体工厂派生产品类实例:一种 VS 多种

    四、简单工厂模式(静态工厂模式)

    组成:一个工厂、一个抽象产品、多个具体产品。工厂里面提供静态方法获取对象实例。
    优点:工厂类是整个模式的关键.包含了必要的逻辑判断,根据外界给定 的信息,决定究竟应该创建哪个具体类的对象.通过使用工厂类,外界可以从直接创建具体产品对象的尴尬局面摆脱出来,仅仅需要负责“消费”对象就可以了。而不必管这些对象究竟如何创建及如何组织的.明确了各自的职责和权利,有利于整个软件体系结构的优化。
    缺点:由于工厂类集中了所有实例的创建逻辑,将全部创建逻辑集中到了一个工厂类中;它所能创建的类只能是事先考虑到的,如果需要添加新的类,则就需要在工厂类中增加相应的业务逻辑。违反开闭原则。

    五、工厂方法模式:factory method

    组成:一个抽象工厂,一个抽象产品,多个具体工厂、多个具体实例。
    去掉了简单工厂模式中的静态方法。在工厂方法模式中,不再提供一个统一的工厂类创建所有的对象,而是针对不同的产品提供不同的工厂。与简单工厂模式相比:引入了抽象工厂角色。由具体的抽象工厂子类去创建对象。解决了简单工厂模式中工厂类职责太重的问题。当有新的产品产生时,只要按照抽象产品角色、抽象工厂角色提供的合同来生成,那么就可以被客户使用,而不必去修改任何已有的代码。符合开闭原则。
    缺点:当产品种类非常多时,会出现大量与之对于的工厂类,这不是我们希望的。

    六、抽象工厂模式:abstract factory

    在工厂方法模式中,具体工厂负责生产具体的产品,每一个具体工厂对应一种具体产品。有时候我们希望一个工厂可以提供多个产品对象,而不是单一的产品对象。如一个电器厂,它可以生产电视机、电冰箱等。与工厂方法模式相比,抽象工厂模式中的具体工厂不只是创建一种产品,而是负责创建一组产品族。为了理解抽象工厂模式,引入两个概念。
    1、产品等级结构:即产品的继承结构。抽象电视机是父类,而具体的品牌海尔电视机、TCL电视机是其子类。
    2、产品族:在抽象工厂模式中,它是指由同一个工厂生产的,位于不同产品等级中的一组产品。如海尔电器工厂生产海尔电视机、海尔冰箱。即一个工厂生产多个产品对象。
     
    总结:
    无论是简单工厂模式,工厂方法模式,还是抽象工厂模式,他们都属于工厂模式,在形式和特点上也是极为相似的,他们的最终目的都是为了解耦。在使用时,我们不必去在意这个模式到底工厂方法模式还是抽象工厂模式,因为他们之间的演变常常是令人琢磨不透的。 在使用工厂模式时,只需要关心降低耦合度的目的是否达到了。
    参考:https://www.cnblogs.com/yumo1627129/p/7197524.html  《Java设计模式》
  • 相关阅读:
    mysql 连接语句
    mysql 查询
    Mysql 创建数据库表(删除,删除,插入)
    Mysql 数据类型
    添物 不花钱学计算机及编程(预备篇)— 编译原理
    添物不花钱学计算机及编程(预备篇)— 计算机组成和原理
    添不花钱学计算机及编程(预备篇)— 操作系统
    添物 不花钱学计算机及编程(预备篇)- 汇编语言
    python 几种点积运算方式效率分析
    AndroidSweetSheet:ViewPager的实现(2)
  • 原文地址:https://www.cnblogs.com/suiyilaile/p/10097640.html
Copyright © 2011-2022 走看看