素材巴巴 > 程序开发 >

设计模式 -- 工厂模式(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;
 }
 

这里写图片描述


标签:

素材巴巴 Copyright © 2013-2021 http://www.sucaibaba.com/. Some Rights Reserved. 备案号:备案中。