C++ 与设计模式学习(其一)

记得曾经一年前,听到同学再说设计模式,当时觉得不怎么重要,所以就没有去系统的学习,这一放,就是一年,直到前段时间,面试了一个阿里巴巴的职位,要我谈谈对于设计模式的看法。

之后就好好了看了一些文章,好好的体会了一番! 现在将自己的心得好好的分享一下吧!(由于设计模式内容比较多,以及设计模式的六大原则,后续都会陆续的更新!)

1. 单例模式(单件模式):单例模式确保某一个类只有一个实例,而且自行实例化并向整个系统提供这个实例单例模式。单例模式只应在有真正的“单一实例”的需求时才可使用。

  举个栗子:

 1 #include<iostream>
 2
 3 class sigle_class {
 4
 5 private :
 6
 7     sigle_class() {};  //将构造函数私有化
 8     static sigle_class * sigle;
 9
10 public:
11     ~sigle_class();
12     static sigle_class * init();
13     void  show() {
14         std::cout <<"这是一个单例模式"<<std::endl;
15     }
16 };
17
18 //对于静态变量需要在内外进行必要的初始化!
19 sigle_class * sigle_class::sigle = NULL;
20
21 sigle_class::~sigle_class() {
22
23     std::cout << "单例模式举例被析构了!" << std::endl;
24 };   //析构函数
25
26 sigle_class * sigle_class::init(){
27
28     if (sigle == NULL) {
29        sigle = new sigle_class();
30     }
31     return  sigle;
32 };
33
34 int  main(int argv ,char args []){
35
36     sigle_class  *sigle= sigle_class::init();    //定义个sigle_class 实例
37       sigle->show();
38     sigle_class  * mode = sigle_class::init();   //顶一个mod的实例
39       mode->show();
40       if (sigle == mode) {
41           std::cout << "sigle == mode" << std::endl;
42       }
43       else {
44           std::cout << "sigle is not equal mode!" << std::endl;
45       }
46       getchar();
47     return 0;
48 }

当然,我们在日常项目中,解愁到的单例模式,远比这个要复杂得多。这里只是打个比方而已!他会设计到单例模式中的两种模式: 赖汉模式,和饱汉模式。

这里因为是对所有的模式,作总结,就不一一例举了!

其实将《泡妞与设计模式》中的那句话改一下,可以这样形容这个模式:

  假如有一个王二小(不是为鬼子带路的王二小),他超爱玩游戏,所以在很多的游戏中都有自己的账号。这就是说,这些账号只有王二小可以使用(当然,这里我们就不说,王二小将账号给朋友去玩了哈!)。这就是一个单例模式。很多时候,单例模式和静态类有点类似,但是不尽相同。

2.     工厂模式:

工厂模式:客户类和工厂类分开。消费者任何时候需要某种产品,只需向工厂请求即可。消费者无须修改就可以接纳新产品。缺点是当产品修改时,工厂类也要做相应的修改。如:如何创建及如何向客户端提供。

举个栗子:

calc.h 头文件

 1 #pragma once
 2  #ifndef _CALC__H__
 3  #define _CALC__H__
 4 #include"Method.h"
 5
 6 //这部分,用来处理得到的数据
 7 //继承
 8 template<typename Tre , typename in >
 9 class calc : private method<Tre>{
10
11 public :
12     //构造函数
13         calc() ;
14         ~calc() {};
15      void show(in ,Tre ,Tre);
16
17 };
18
19 //定义一个魔板构造函数
20 template<typename Tre, typename in>
21 calc<Tre, in >::calc() {
22
23     cout << "is being constructor !" << endl;
24 };
25
26 //通过封装这个+-*/,并调用这个函数
27 template<typename Tre, typename in>
28 void calc<Tre, in >::show(in type, Tre a, Tre b) {
29
30     char *p[5] = { "+","-","*","/" };
31     printf("%lf %s %lf = %lf \n", a, p[type], b,this->Add(a,b));
32
33 }
34
35 #endif    

Method.h 头文件

 1 #pragma once
 2 #ifndef _METHOD_H_
 3 #define _METHOD_H_
 4 #include <stdexcept>
 5 #include"Calc.h"
 6
 7 /*
 8  实现 加 减 乘 除
 9 */
10 template<typename T >
11 class method{
12 public :
13       method() {};
14      ~method() {};
15      T  Add ( T  , T   )    ;
16      T Sub (T   , T  )    ;
17      T Mul (T  , T     );
18      T Div ( T , T  );
19 };
20
21
22 template<typename T >
23 T method< T >::Add(T a, T  b) {
24
25     return a + b;
26 }
27
28 template<typename T >
29 T  method< T >::Sub(T pre, T nex) {
30
31     return pre - nex;
32 }
33
34 template<typename T >
35 T method< T >::Mul(T a, T b) {
36
37     return a*b;
38 }
39
40 template<typename T >
41 T method< T >::Div(T a, T b) {
42     if (b == 0) {
43         throw out_of_range("被除数为0,这是违反的!");
44         return  -INT_MAX;
45     }
46     return a / b;
47 }
48
49 #endif

Main.cpp

 1 /* 设计模式之计算器 比如: 加 减 乘 除 */
 2 #include<iostream>
 3 #include"Calc.h"
 4 #include"Method.h"
 5 #include<stdio.h>
 6
 7 using namespace std;
 8
 9 int main(int argv ,char args [] ) {
10
11     calc<double,int >  mycalc;
12     printf("hello the worlkd !! \n");
13     mycalc.show(0,4.0,2);
14     getchar();
15     return 0;
16 }

这种模式其实跟我们说所的继承差不离,但是继承只是一个语言功能,而这种模式是分配调度.....两者存在本质上的不同、就如上面的例子而言,其加减乘除全部是来自另一个calc类,而充当method的父类,method作为核心类,只是作为一个枢纽而已。它的计算功能依附其他的例,这在java就是interface(接口)来完成这些重要的功能。

3 . 工厂方法模式:

定义:

工厂方法模式:核心工厂类不再负责所有产品的创建,而是将具体创建的工作交给子类去做,成为一个抽象工厂角色,仅负责给出具体工厂类必须实现的接口,而不接触哪一个产品类应当被实例化这种细节。

那么,举个栗子:

额,这让我想起了<篮球火>,那就说说篮球的队,我们知道篮球队是有队员组成的,其中队员扮演不同的角色(5个吧),大前锋,中峰,小前锋,得分后卫,和控球后卫。   那么,我们可以将篮球队做成一个抽象类, 然后各个角色充当具体类。

看代码:(简单的描述一下下)

//Game.h

#pragma once
#ifndef _GAME_H_
#define _GAME_H_
#include<iostream>
#include<string>
using namespace std;

//篮球比赛
class bigGame {

private :

    //取名字
    string str;

public:

    bigGame(string  st): str(st){ };
    virtual ~ bigGame() {};

    //全明星最有价值职位:
     void  famous_Role() {
        cout << "the most valuer of role is " << str << endl;
    };

};

#endif

//    Roler.h

#pragma once
#ifndef _ROLER_H
#define _ROLER_H
#include "Team.h"
#include "Game.h"
class Roler : public Team {

public :
    Roler();
    virtual ~ Roler();
    virtual bigGame * PlayShow();
};

#endif

// team.h

#pragma once
#ifndef _TEAM_H_
#define _TEAM_H_
#include "Game.h"
//充当team的扮演角色
class Team {

public :

   Team();
   virtual ~ Team();
   virtual bigGame * PlayShow(void ) =0 ;

};
#endif

以上是头文件,然后是实现类:采用多文件形式,这个看个人的喜好!!

 1 //  Roler.cpp
 2
 3 #include "Roler.h"
 4 #include "Game.h"
 5 #include<iostream>
 6 //构造函数
 7   Roler::Roler() {
 8
 9  }
10
11 //析构函数
12   Roler::~Roler() {
13
14   }
15
16   //角色具体化
17   bigGame * Roler::PlayShow() {
18       //std::cout << "小前锋" << std::endl;
19       return  new  bigGame("小前锋");
20   }
21
22 //   Team.cpp
23
24 #include "Team.h"
25 Team::Team() {}
26 Team::~Team() {}
27
28
29 //  Main.cpp
30
31 #include"Roler.h"
32 #include"Team.h"
33 #include<iostream>
34 using namespace std;
35
36 int main(int args , char argv[]) {
37
38
39     Roler myrole;
40     bigGame *my = myrole.PlayShow();
41     my->famous_Role();
42     getchar();
43     return 0;
44 }

  其实,可以看出,工厂方法模式--其实注重的是对于方法函数的继承,当然工厂方法模式也是有简单工厂模式改进而来,所以有工厂模式的模式~~!

-------------------------------------------------------------华丽丽的分割线----------------------------------------------------------------------------

              由于是刚接触到设计模式,没有较为深度的理解,就我所理解的,分享一下下,欢迎大侠们指正!

时间: 2024-10-13 12:17:52

C++ 与设计模式学习(其一)的相关文章

设计模式学习总结

本文是对各处设计模式示例的总结概括和简化,主要参考 http://blog.csdn.net/zhangerqing/article/details/8194653 直接看本文估计比较枯燥无聊,因为没图~~??,建议对设计模式有兴趣的先看看上面的博文,或者基础比较好可直接移到最底下看下我的各模式一句话概括总结,有什么意见建议欢迎提出~~~~~~~~~~ 总体来说设计模式分为三大类:创建型模式,共五种:工厂方法模式.抽象工厂模式.单例模式.建造者模式.原型模式.结构型模式,共七种:适配器模式.装饰

java/android 设计模式学习笔记(14)---外观模式

这篇博客来介绍外观模式(Facade Pattern),外观模式也称为门面模式,它在开发过程中运用频率非常高,尤其是第三方 SDK 基本很大概率都会使用外观模式.通过一个外观类使得整个子系统只有一个统一的高层的接口,这样能够降低用户的使用成本,也对用户屏蔽了很多实现细节.当然,在我们的开发过程中,外观模式也是我们封装 API 的常用手段,例如网络模块.ImageLoader 模块等.其实我们在开发过程中可能已经使用过很多次外观模式,只是没有从理论层面去了解它. 转载请注明出处:http://bl

java/android 设计模式学习笔记(10)---建造者模式

这篇博客我们来介绍一下建造者模式(Builder Pattern),建造者模式又被称为生成器模式,是创造性模式之一,与工厂方法模式和抽象工厂模式不同,后两者的目的是为了实现多态性,而 Builder 模式的目的则是为了将对象的构建与展示分离.Builder 模式是一步一步创建一个复杂对象的创建型模式,它允许用户在不知道内部构建细节的情况下,可以更精细地控制对象的构造流程.一个复杂的对象有大量的组成部分,比如汽车它有车轮.方向盘.发动机.以及各种各样的小零件,要将这些部件装配成一辆汽车,这个装配过

java/android 设计模式学习笔记(一)---单例模式

前段时间公司一些同事在讨论单例模式(我是最渣的一个,都插不上嘴 T__T ),这个模式使用的频率很高,也可能是很多人最熟悉的设计模式,当然单例模式也算是最简单的设计模式之一吧,简单归简单,但是在实际使用的时候也会有一些坑. PS:对技术感兴趣的同鞋加群544645972一起交流 设计模式总目录 java/android 设计模式学习笔记目录 特点 确保某一个类只有一个实例,而且自行实例化并向整个系统提供这个实例. 单例模式的使用很广泛,比如:线程池(threadpool).缓存(cache).对

java/android 设计模式学习笔记(7)---装饰者模式

这篇将会介绍装饰者模式(Decorator Pattern),装饰者模式也称为包装模式(Wrapper Pattern),结构型模式之一,其使用一种对客户端透明的方式来动态的扩展对象的功能,同时它也是继承关系的一种替代方案之一,但比继承更加灵活.在现实生活中也可以看到很多装饰者模式的例子,或者可以大胆的说装饰者模式无处不在,就拿一件东西来说,可以给它披上无数层不一样的外壳,但是这件东西还是这件东西,外壳不过是用来扩展这个东西的功能而已,这就是装饰者模式,装饰者的这个角色也许各不相同但是被装饰的对

设计模式学习难度系数排名

这是yqj2065感觉的每个设计模式学习难度系数. 刘伟(Sunny)先生有一个5分制的学习难度,列在模式名称之后. 有几个模式的评价差别很大,抽象工厂模式和享元模式给4分/5,而单例模式1分/5.冠军是一样的. 学习难度系数: ☆☆☆☆☆ ☆☆☆☆☆ 依赖注入模式 静态工厂模式 2 策略模式 1 ★☆☆☆☆ ☆☆☆☆☆ 工厂方法模式 2 模板方法模式 2 适配器模式    2 责任链模式   3 外观模式 1 ★★☆☆☆ ☆☆☆☆☆ 抽象工厂模式  4 桥接模式  3 迭代器    3 享元模

设计模式学习--Singleton

What Singleton:保证一个类仅有一个实例,并提供一个访问它的全局访问点. Why Singletion是我比较熟悉的设计模式之一,在平常的开发过程中,也曾几次用到,它主要适用于如下场景: 1.当类只能有一个实例而且客户可以从一个众所周知的访问点访问它时. 2.当这个唯一实例应该是通过子类可扩展的,并且客户应该无需更改代码就能使用一个扩展的实例时. 在系统设计中,在涉及系统资源的管理时,往往会被设计成Singletion模式,比如缓存.日志对象.线程池.对话框等等. How 假设如下场

设计模式学习03—抽象工厂模式

1.动机与定义 工厂模式中,一个工厂仅仅能提供一个或一类产品,当产品种类较多,形成产品系列(比方我们要创建跨平台的button,菜单,文本框等等一系列GUI控件: 单纯使用工厂模式会产生大量工厂,并且后期维护也不方便,我们能够从产品中找到规律,假设产品等级相对固定,以后仅仅会新增产品族,那么我们就能够把整个产品族放到一个工厂创建,以后新增其它系统产品族也很方便,例如以下图: 这样的模式就是抽象工厂,工厂方法模式针对的是一个产品等级结构,而抽象工厂模式则须要面对多个产品等级结构,一个工厂等级结构能

大话设计模式学习笔记——面向对象基础

前言 好记性不如烂"笔头"系列--大话设计模式学习笔记 目录 面向对象基础 面向对象基础 什么是类与实例 一切事物皆为对象,即所有的东西老师对象,对象就是可以看到.感觉到.听到.触摸到.尝到.或闻到的东西.准确地说,对象是一个自包含的实体,用一组可识别的特性和行为来标识.面向对象编程,英文叫 Object-Oriented Programming,其实就是针对对象来进行编程的意思.类就是具有相同属性和功能的对象的抽象集合.实例就是一个真实的对象.比如我们属于'人'类,而个人就是'人'类

java/android 设计模式学习笔记(13)---享元模式

这篇我们来介绍一下享元模式(Flyweight Pattern),Flyweight 代表轻量级的意思,享元模式是对象池的一种实现.享元模式用来尽可能减少内存使用量,它适合用于可能存在大量重复对象的场景,缓存可共享的对象,来达到对象共享和避免创建过多对象的效果,这样一来就可以提升性能,避免内存移除和频繁 GC 等. 享元模式的一个经典使用案例是文本系统中图形显示所用的数据结构,一个文本系统能够显示的字符种类就是那么几十上百个,那么就定义这么些基础字符对象,存储每个字符的显示外形和其他的格式化数据