美文网首页
设计模式——工厂方法

设计模式——工厂方法

作者: 东方胖 | 来源:发表于2023-08-12 21:23 被阅读0次

设计模式是指在使用静态语言(动态脚本语言也适用,但是由于存在较大的语言差异,把静态语言的编码方法“翻译”到动态语言中,往往会破坏一些编码原则,以后可能会专门辟一文来对比C++和Python)
中针对某些问题的一种编码模式,

具体而言,一个模式可能是一组类之间的关系的“拼凑”——协作关系。

在学习设计模式时,一般需要弄清楚上述的所谓协作关系。

因为必须要知道所谓的 OO —— Object-Orient 编程——面向对象编程

本文不述

先陈列几种在面向对象语言下的代码协作关系

  • association
    通常是指 类A中的某个函数的参数是类型是 B ,于是 A 和 B就有一种联系,这种关系比较弱
  • 组合
    类B 作为子成员置于B的属性中,A持有B的句柄,引用,或者说指针。
    例子
class B;
class A {
public:
    A() {
    }

private:
   B * b;
};

上面的组合,意味着 B在其域内——任何函数内部,可以用 b的句柄,操纵 A 的方法(A中那些声明为 public的方法)

  • 聚合
    作为一种1-n的组合方式
  • 继承
    继承是作为面向对象比较特别的东西,当一个类B 从另一个类A继承时,B一般叫子类,A 一般叫父类,子类继承父类,会把protected 的属性和方法复制过来,当然,作为子类,对父类的“隐私”也是具有一定窥视权,窥视的范围有多大取决于继承的方式
    有三种 public private protect
    最常见的 是 public 继承。

另一种继承利用的时面对象语言最重要的一个特性:多态
多态使得子类可以从父类继承一种命名保持一致性的函数方法,然后在运行时决定到底是运行哪个子类的方法。
在几乎所有的所谓设计模式中,多态特性几乎都会亮相

以上常见的协作,构成了设计模式实现中的基本成分

工厂方法
以前我印象中工厂方法是大概这样的样子:

class Product
{
};
class ProductA: public Product
{
};
class ProductB: public Product
{
};

class Factory
{
public:
    enum ProductType
    {
    A = 0,
    B = 1
    };

    virtual Product* createProduct(int type) {
         switch (type) {
         case A:
              return new ProcuctA();
         case B:
              return new ProductB();
         default:
             // ...
    }
}

Factory 定义了一个抽象的方法,如果需要扩展产品C ProductC ,那么需要继承 Factory(在Facotory 中改也可以,但是导致要覆盖测试所有之前的代码,需要改动几个地方)

扩展 createProduct方法可以修改逻辑,如下

Product* createProduct(int type) {
         switch (type) {
         case C:
              return new ProcuctC();
         }
          return Factory::createProduct(type);
    }

用工厂模式,最大的特点是什么。其实是那new ProductXXX 隐藏起来。
我们正常的编码方式是像下面这样

ProductA * a = new ProductA(); 

出现在某处上下文中。
这种办法其实没什么问题,只是在当 ProductA ProductC ProductB变成一个系列的时候,并且,随时会ABC发生一些替换的修改发生,这样我们需要改 new ProductA()的代码

看看《设计模式-可复用面向对象的基础》这本书怎么描述工厂模式的。

Define a interface for creating an object , but let subclasses decide which class to instancitate.Factory Method lets a class defer instantiation to subclasses.
以上的定义中,可以看到
工厂模式主要有两个特性:

  • 定义接口创建对象。即上面说得 把new ProductXXX这种代码隐藏起来
  • 子类决定实例化哪个类。 工厂模式将类的实例化延迟到子类中。

第二点颇难索解,原因在于上面那个用枚举类型分拆的写法没有定义纯接口,直接在第一层的创建函数中就开始实现。实际上可以在子类中来做,并且把 switch-case的写法也可以改成一个一个的抽象接口的样子。

于是,凡我们见到创建对象不是用 new 而是要调一个接口 createXXX 或者buildXXX我们知道 多半是运用了工厂模式。

工厂方法的几个变种

  • 除了上面的参数化的写法,还有一种是每个类型的Product对应一个工厂方法
    类似下面的代码—从《设计模式》这本书中摘取
class MazeGame
{
    Maze* CreateMaze() ;
     // factory
    virtual Maze* MakeMaze() const {return new Maze();}
    virtual Room* MakeRoom() const {return new Room();}
    virtual Wall *MakeWall() const {return new Wall();}
    virtual Door* MakeDoor() const {return new Door(); }
}

以上的 virtual 接口都是工厂方法
如果有新的组件需要扩展,则继承 MazeGame 然后增加接口进行创建新类型。

  • 一种模版方法可以省掉每次有新品要创建就得创建MazeGame子类的方法
    概要如下
class Creator
{
public:
  virtual createProduct() = 0;
} ;
template<class TheProduct>
class MazeGame: public Creator {
  virtual Product* createProduct(); 
};

class MyProduct: public Product
{
public:

};
// client code
MazeGame<MyProduct> myCreator;// 

上面这种模版方法很广泛存在各种类库,稍加注意

相关文章

  • 2021-11-16 - 学习记录

    设计模式学习:创建型:工厂(工厂方法,抽象工厂),建造者,单例,原型 设计模式:工厂模式 简单工厂 工厂方法 抽象工厂

  • 设计模式-工厂模式

    设计模式1 设计模式2 工厂模式 工厂模式可简单的分为三类:简单工厂,工厂方法,抽象工厂 简单工厂模式 定义 简单...

  • 工厂模式

    工厂模式 就是工厂---生产-->产品 在设计模式中,分为 简单工厂模式, 工厂方法模式,抽象工厂模式. 工厂模式...

  • 设计模式之简单工厂、工厂方法、抽象工厂

    设计模式之简单工厂、工厂方法、抽象工厂 什么是设计模式? 设计模式(Design pattern)代表了最佳的实践...

  • PHP-浅谈单例模式和工厂模式

    PHP中常用的设计模式有单例模式、工厂模式(简单工厂模式、工厂方法模式和抽象工厂方法模式)、适配模式、策略模式。 ...

  • 大话设计模式之_工厂模式

    大话设计模式之_工厂模式 工程方法(即简单工厂模式simpleFactory,或静态工厂方法 static fac...

  • spring 设计模式篇(前)

    设计模式俗称:套路 一、spring常见设计模式 (23种设计模式) 创建型:工厂方法模式、抽象工厂模式、建造者...

  • 设计模式(六)抽象工厂模式

    导读:前文设计模式(五)工厂方法模式介绍了工厂方法模式,本篇开始介绍抽象工厂模式,继续优化工厂方法模式,更好的满足...

  • 简单工厂模式

    Android进阶之设计模式 简单工厂模式 简单工厂模式(又叫作静态工厂方法模式), 其属于创建型设计模式,但并不...

  • 设计模式之工厂方法模式(创建型)

    一、模式定义 工厂方法模式:又称工厂模式,也叫虚拟构造器模式,属于构建型设计模式,工厂方法模式是在简单工厂模式上进...

网友评论

      本文标题:设计模式——工厂方法

      本文链接:https://www.haomeiwen.com/subject/uzgxmdtx.html