学习设计模式基础的心得与代码(一)

本文介绍了三种常用的设计模式:单例模式、抽象工厂模式和代理模式。单例模式确保类的一次实例化,抽象工厂模式有助于维持代码开闭原则并降低类间的耦合度,而代理模式则用于结构化设计中,通过代理调用多种方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

由于只学了几个简单的设计模式,就想分享一下感受。主要是:单例、抽象工厂、代理模式等几个简单的模式。

(一)单例模式:

属于创建对象模式的一种,及最整个程序,智能将类进行一次实例化。用到了静态函数与静态变量的特性,较为简单易懂。

代码:

 
  class My{private:
  int i;
  int j;
  static My * m;
  My(int i,int j){//构造函数私有化,使客户端无法调用构造函数
  this->i=i;
  this->j=j;
  }
  public:
  static My * Creat(int i,int j ){
  if(m==NULL){//表示该类还没有实例化对象
  m=new My(i,j);
  }
  return m;
  }
  void Print(){
  cout<<"i="<<i<<endl;
  cout<<"j="<<j<<endl;
  }
  };
  My* My::m=NULL;

(2)抽象工厂

· 也是创建对象方式的一种,主要是为了维持代码的开闭原则,减少类与类之间的耦合度。一个工厂只负责一个方法。这样在扩充方法的同时,只要扩充工厂就可以,不必打开代码进行代码的修改。

代码:

  //一个工厂负责一个铲平,便于产品的的增加,减少客户端的麻烦
  #include<iostream>
  using namespace std;
  class Product{
  public:
  virtual void Do(){
  cout<<"Product.Do"<<endl;
  }
  virtual ~Product(){
  cout<<"Product.des"<<endl;
  }
  };
  class ProductA:public Product{
  public:
  void Do(){
  cout<<"ProductA.Do"<<endl;
  }
  ~ProductA(){
  cout<<"ProductA.des"<<endl;
  }
  };
  class ProductB:public Product{
  public:
  void Do(){
  cout<<"ProductB.Do"<<endl;
  }
  ~ProductB(){
  cout<<"ProductB.des"<<endl;
  }
  };
  class ProductC:public Product{
  public:
  void Do(){
  cout<<"ProductC.Do"<<endl;
  }
  ~ProductC(){
  cout<<"ProductC.des"<<endl;
  }
  };
  class Factory{
  protected:
  Product *p;
  public:
  virtual void send()=0;
  virtual~Factory(){
  delete p;
  p=NULL;
  cout<<"Factory.des"<<endl;
  }
  };
  class FactoryA:public Factory{
  public:
  FactoryA(){
  p=new ProductA();
  cout<<"Factory.cout"<<endl;
  }
  void send(){
  p->Do();
  }
  ~FactoryA(){
  delete p;
  p=NULL;
  cout<<"FactoryA.des"<<endl;
  }
  };

(三)代理模式:

通过代理可以通过代理进行一个又个方法的调用。由于与各个方法之间有共同的父类,可以通过父类来访问各种方法。将多态特性发挥到淋漓尽致,主要用于结构化设计中:

代码:
  #include<iostream>
  using namespace std;
  class Base{
  public:
  virtual void method()=0;
  virtual ~Base(){
  cout<<"Base.des"<<endl;
  }
  };
  class Source:public Base{
  public:
  void method(){
  cout<<"咖啡功能实现"<<endl;
  }
  };
  //此处还有都种方法模式功能等待代理去用,基本模式框架一致,故在此省略;
  class Proxy:public Base{//代理
  private:
  Base *t;
  public:
  Proxy(Base *t){
  this->t=t;
  }
  void method(){
  t->method();
  cout<<"代理功能实现"<<endl;
  }
  ~Proxy(){
  delete t;
  t=NULL;
  cout<<"Proxy.des"<<endl;
  }
  };



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值