工厂模式

来源:互联网 发布:经颅多普勒正常值数据 编辑:程序博客网 时间: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