设计模式 -- 工厂模式(Factory)
程序开发
2023-09-07 10:09:40
工厂模式
先来看看这样一个情形:假设我们在做一款大型多人在线网游,里面的怪物有成百上千种,这时怪物类我们很容易想到用多态去实现。即抽象出怪物共有属性,不同怪物类都继承这个基类。好,如果怪物类就这么封装,那么在需要怪物的地方都要new XX怪物类,那么会有几个这样的问题,1,客户程序员必须知道实际子类的名称(当系统复杂后,命名将是一个很不好处理的问题,为了 处理可能的名字冲突,有的命名可能并不是具有很好的可读性和可记忆性,就姑且不论不同程序员千奇百怪的个人偏好了), 2,程序的扩展性和维护变得越来越困难。
而所谓工厂模式就是为了管理这些派生类对象的创建,即同一类别很多对象需要new创建时可以考虑用一个单独的类去管理这些对象的创建,把new操作封装到内部,这样结构更清晰,这个管理类就是我们的工厂,外部要创建具体对象,就都统一向这个工厂拿,不需要自己去new创建了,外部统一了接口。
工厂模式结构图:
注释:工厂模式也带来一个问题,就是只要添加一个新派生对象,就得对应改这个工厂管理类,这样 Factory 的接口永远就不能封闭(Close)。当然我们可以通过创建一个 Factory 的子类来通过多态实现这一点, 但是这也是以新建一个类作为代价的。
示例
假设有一个麦当劳,我们去买吃的,那么这个麦当劳就相当于工厂,各种吃的相当于派生类对象,而我们要什么吃的,就只管向麦当劳店去拿,具体加工过程我们不用管。
各种吃的:
//
// Product.h
// DesignMode
//
// Created by app05 on 15-10-28.
// Copyright (c) 2015年 app05. All rights reserved.
//#ifndef __DesignMode__Product__
#define __DesignMode__Product__class Product
{
public:virtual ~Product() = 0;protected:Product();private:};class ChickenProduct : public Product
{
public:ChickenProduct();~ChickenProduct();
};class ChipsProduct : public Product
{
public:ChipsProduct();~ChipsProduct();
};#endif /* defined(__DesignMode__Product__) */
//
// Product.cpp
// DesignMode
//
// Created by app05 on 15-10-28.
// Copyright (c) 2015年 app05. All rights reserved.
//#include "Product.h"
#include
using namespace std;Product::Product()
{
}Product::~Product()
{
}ChickenProduct::ChickenProduct()
{cout<<"我要一份鸡翅...."<
麦当劳工厂:
//
// Factory.h
// DesignMode
//
// Created by app05 on 15-10-28.
// Copyright (c) 2015年 app05. All rights reserved.
//#ifndef __DesignMode__Factory__
#define __DesignMode__Factory__enum ProductType {CHICKEN, CHIPS};class Product;
class Factory
{
public:Factory();~Factory();Product* CreateProduct(ProductType type);};#endif /* defined(__DesignMode__Factory__) */
//
// Factory.cpp
// DesignMode
//
// Created by app05 on 15-10-28.
// Copyright (c) 2015年 app05. All rights reserved.
//#include "Factory.h"
#include "Product.h"
#include
using namespace std;Factory::Factory()
{cout << "创建工厂" << endl;
}Factory::~Factory()
{
}Product* Factory::CreateProduct(ProductType type)
{switch (type){case CHICKEN:return new ChickenProduct();break;case CHIPS:return new ChipsProduct();break;}
}
我们叫吃的:
//
// main.cpp
// DesignMode
//
// Created by app05 on 15-10-28.
// Copyright (c) 2015年 app05. All rights reserved.
//#include "Factory.h"
#include "Product.h"
#include
using namespace std;int main(int argc, const char * argv[])
{Factory* fac = new Factory();Product* p1 = fac->CreateProduct(CHICKEN);Product* p2 = fac->CreateProduct(CHIPS);return 0;
}
标签:
上一篇:
网站交互、开发方式和前端框架介绍
下一篇:
相关文章
-
无相关信息