工厂模式
来源:互联网 发布:经颅多普勒正常值数据 编辑:程序博客网 时间:2024/06/05 15:05
工厂模式是编码过程中最常用的设计模式之一;
工厂模式,顾名思义,就像生活中的工厂一样,原材料进去,成品出来,客户不用关心生产过程。
例如:当我们有许多订单需要处理的时候,不必一一找生产线生产,只需要将订单统一格式交给工厂;工厂会帮我们统一处理。当订单多的时候,不至于代码凌乱,同时做到了低耦合。
设计模式实际上是将我们生活中的一些技巧用到代码中。
工厂模式主要技术就是C++中的多态性,将子类的实例赋值给基类接口指针,通过基类接口指针调用成员函数可动态联翩到子类对应的函数。
这里的这个工厂例子使用了模板基础类,用于实现公共方法。
#include <iostream.h>typedefunsigned int U32;typedef U32 TRANSACTION;#define ORDER1_REQ 1#define ORDER2_REQ 2union MESSAGE{ TRANSACTION orderNo;};//订单消息头,typedef struct orderHeader{ TRANSACTION orderNo; char* name;} orderHeader;//订单1 (生产电视)typedef struct order1Req:orderHeader{ char* television; float money;} order1Req;//订单2 (生产电视和空调)typedef struct order2Req:orderHeader{ char * television; char * aircondition; float money; } order2Req;//订单接口类class orderIf{public: virtual ~orderIf() {}; virtual void getOrderNo(void) const = 0; virtual void getName(void) const = 0; virtual bool televisionHandling(void) const = 0; virtual bool airconditionHandling(void) const = 0; virtual float moneyPay(void) = 0;protected: orderIf() {};};//模板订单基类,用于实现订单“公有方法”template<typename orderType>class orderBase: public orderIf{public: orderBase(orderType ** const order_pp): order_pp_(order_pp) { } ~orderBase() { delete order_pp_; order_pp_ = 0; } void getOrderNo() const {cout<<"The orderNo is: "<<getOrderPtr()->orderNo<<endl; } void getName() const {cout<<"The order name is: "<<getOrderPtr()->name<<endl; }protected: orderType * getOrderPtr(void) const { //子类可用此指针调用方法 return *order_pp_; }private: orderType ** order_pp_;}; //订单处理类1class order1ReqProcessing: public orderBase<order1Req>{public: explicit order1ReqProcessing(order1Req ** order_p): orderBase<order1Req>(order_p) { } virtual ~order1ReqProcessing() { } float moneyPay(void) { cout<<"order1 Pay money: "<<(getOrderPtr()->money) <<endl; return 1; } bool televisionHandling(void) const { cout<<"I'm produceing television: "<<(getOrderPtr()->television)<<endl; return 1; } bool airconditionHandling(void) const { cout<<"I'm not produceing aircondition !"<<endl; return 0; } private: order1Req ** order_p;}; //订单处理类2class order2ReqProcessing: public orderBase<order2Req>{public: explicit order2ReqProcessing(order2Req ** order_p): orderBase<order2Req>(order_p) { } virtual ~order2ReqProcessing() { } float moneyPay(void) { cout<<"order2 pay money: "<<(getOrderPtr()->money) <<endl; return 1; } bool televisionHandling(void) const { cout<<"I'm produceing television: "<<(getOrderPtr()->television) <<endl; return 1; } bool airconditionHandling(void) const { cout<<"I'm produceing aircondition: "<<(getOrderPtr()->aircondition) <<endl; return 1; } private: order2Req ** order_p;}; //工厂class equipmentFactory{public: static orderIf * create(union MESSAGE **order_pp) { const orderHeader* const order_p = reinterpret_cast<orderHeader*>(*order_pp); const TRANSACTION orderNo = order_p->orderNo; orderIf * equip_p; switch (orderNo) { case ORDER1_REQ: { order1Req ** const orderTemp_pp = reinterpret_cast<order1Req **>(order_pp); equip_p = static_cast<orderIf *>(new order1ReqProcessing(orderTemp_pp)); } break; case ORDER2_REQ: { order2Req ** const orderTemp_pp = reinterpret_cast<order2Req **>(order_pp); equip_p = static_cast<orderIf *>(new order2ReqProcessing(orderTemp_pp)); } break; default: equip_p = 0; break; } return equip_p;} private: equipmentFactory(); ~equipmentFactory();}; //业务处理int main(){ order1Req *order_pp = new order1Req; order_pp->orderNo = 1; order_pp->name = "orderReq1"; order_pp->television = "LG"; order_pp->money = 80000; orderIf *orderIf_p = equipmentFactory::create(reinterpret_cast<MESSAGE**> (&order_pp)); orderIf_p->getOrderNo(); orderIf_p->getName(); orderIf_p->televisionHandling(); orderIf_p->airconditionHandling(); orderIf_p->moneyPay(); return 1;}
0 0
- 工厂模式 -- 工厂方法
- 工厂模式 -- 抽象工厂
- 工厂模式-简单工厂
- 工厂模式-工厂方法
- 工厂模式:静态工厂
- 工厂模式-简单工厂
- 工厂模式-抽象工厂
- 工厂模式-工厂方法
- 工厂 > 工厂方法模式
- 工厂模式-静态工厂
- 工厂模式-抽象工厂
- 工厂模式
- 工厂模式
- 工厂模式
- 工厂模式
- 工厂模式
- 工厂模式
- 工厂模式
- java找到文件夹下所有的指定格式文件并输出到txt
- Linux用户组与文件权限
- Block学习一:基本用法,用block封装NSURLRequest异步请求
- 在前人代码的基础上写的JS函数
- 设备管理器里的6TO4 Adapter
- 工厂模式
- 论SEO
- insmod
- Reduce Gaming Latency (Lowering Ping) in Windows
- 关于OC 的Initialize
- Visual Studio 2010 + IE 9无法断点调试JavaScript的解决方法
- C常见编译错误(转)
- .Net Ajax调用后台代码
- 关于view的变换