首页 > 其他 > 详细

工厂方法

时间:2020-11-11 18:09:45      阅读:38      评论:0      收藏:0      [点我收藏+]

经常听人说工厂方法+反射机制+单例模式,可以解决大多数的对象创建的问题。但是什么是工厂方法呢?还有其他什么鬼呢?
这里先介绍简单的工厂方法,也就是Factory Method方法,既然这是简单的,那岂不是还有复制的或者其它,那是当然的。不过都得一步一步来嘛。

做什么?

首先明确我们用工厂模式做什么?
那么我们的客户来需求了,”我们要创建在一个模块中创建A类的对象“,
”没关系,我知道那个代码在哪里,我们就在那里创建A的对象。

// file1
class A {
 // ....
};  // class A
 
// ...
  A* a = new A();
 // ...

现在突然客户背后站了会说,“这个不太好,我们可能后面需要创建Class B, C , D ...”。
默默的说一句,md,你怎么这么多问题啊(小声)。 “没问题,我们改代码,那么我们将对象指针抽象一下,提一个基类吧,抽象一下,好吧。”

// commom file 
{
class Base {
  // ....
};  // class Base

}

// file1
{
class A : public Base{
 // ....
};  // class A
}

// file2 
{
class B : public Base{
 // ....
};  // class B
}
// ...
  Base* base = new A(); // Base* base = new B();
 // ...

这时候客户说,”好像哈,我觉得..., 是这样的,我觉得 你左边那部分好像有点那个意思了,但是你这右边还是有点不行啊,你用new创建,那不是和具体的创建绑定死了,
这不行你还得改。对了,五点我该下班了,你也早点下班“。
"md(低声), ok,没得问题"。

那么怎么办呢,感觉可能拨了键盘上的头发,这样吧,我们通过其他的类来返回这个对象指针吧。
既然是其他类返回的这个对象指针,那么我们就叫那个类为工厂类吧。

class BaseFactory {
public:
  Base* CreateNewBase {
    return new A(); // return new B();
  }
}

"完蛋,明天又要开例会了", 自己心中暗中一想,完蛋虽然上面这样写,好像是没有用new创建,但是不是还是换汤不换药嘛,还得改。
”咦,不是还有多态嘛“,对啊多态,这时候virtual一下子跳入了脑海。

class BaseFactory {
public:
  virtual Base* CreateNewBase = 0;
}

class FactoryA : public BaseFactory {
public:
  virtual Base* CreateNewBase override;
}

class FactoryB : public BaseFactory {
public:
  virtual Base* CreateNewBase override;
}

例会上,屁颠屁颠的和客户讲了下这个,感觉很自豪。
客户摸了摸自己浓密的头发,说到”不错,我就是想让你做成类似这个样,但是我当时没想起名字, 不错了,但是这里有个问题 。。。“
”啥,还有问题“。
”就是哈,我能不能通过注册的方式,申请一个类的对象啊,比如我只会配置json文件,我也看不懂代码, 而且我想通过一张表来保存我想创建的对象,随时随地创建可以吗“。
”。。。。。。,我觉得这个得加钱(小声)。我觉得可能行吧,但是我有点不舒服,今天感觉有点感冒,我要去医院检查“。
”啥,新冠?那你先去体检吧“。

我们来描述下上面那个场景的代码结构

技术分享图片

故事中的A,B就是ConcreteProduct, Base就是Product, BaseFactory就是Creator, FactoryA就是ConcreteCreator
那么我们用代码重现structure

待续

工厂方法

原文:https://www.cnblogs.com/cyssmile/p/13959695.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!