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

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

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

  举个栗子:

 #include<iostream>

 class sigle_class {

 private :

     sigle_class() {};  //将构造函数私有化
static sigle_class * sigle; public:
~sigle_class();
static sigle_class * init();
void show() {
std::cout <<"这是一个单例模式"<<std::endl;
}
}; //对于静态变量需要在内外进行必要的初始化!
sigle_class * sigle_class::sigle = NULL; sigle_class::~sigle_class() { std::cout << "单例模式举例被析构了!" << std::endl;
}; //析构函数 sigle_class * sigle_class::init(){ if (sigle == NULL) {
sigle = new sigle_class();
}
return sigle;
}; int main(int argv ,char args []){ sigle_class *sigle= sigle_class::init(); //定义个sigle_class 实例
sigle->show();
sigle_class * mode = sigle_class::init(); //顶一个mod的实例
mode->show();
if (sigle == mode) {
std::cout << "sigle == mode" << std::endl;
}
else {
std::cout << "sigle is not equal mode!" << std::endl;
}
getchar();
return ;
}

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

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

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

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

2.     工厂模式:

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

举个栗子:

calc.h 头文件

 #pragma once
#ifndef _CALC__H__
#define _CALC__H__
#include"Method.h" //这部分,用来处理得到的数据
//继承
template<typename Tre , typename in >
class calc : private method<Tre>{ public :
//构造函数
calc() ;
~calc() {};
void show(in ,Tre ,Tre); }; //定义一个魔板构造函数
template<typename Tre, typename in>
calc<Tre, in >::calc() { cout << "is being constructor !" << endl;
}; //通过封装这个+-*/,并调用这个函数
template<typename Tre, typename in>
void calc<Tre, in >::show(in type, Tre a, Tre b) { char *p[] = { "+","-","*","/" };
printf("%lf %s %lf = %lf \n", a, p[type], b,this->Add(a,b)); } #endif

Method.h 头文件

 #pragma once
#ifndef _METHOD_H_
#define _METHOD_H_
#include <stdexcept>
#include"Calc.h" /*
实现 加 减 乘 除
*/
template<typename T >
class method{
public :
method() {};
~method() {};
T Add ( T , T ) ;
T Sub (T , T ) ;
T Mul (T , T );
T Div ( T , T );
}; template<typename T >
T method< T >::Add(T a, T b) { return a + b;
} template<typename T >
T method< T >::Sub(T pre, T nex) { return pre - nex;
} template<typename T >
T method< T >::Mul(T a, T b) { return a*b;
} template<typename T >
T method< T >::Div(T a, T b) {
if (b == ) {
throw out_of_range("被除数为0,这是违反的!");
return -INT_MAX;
}
return a / b;
} #endif

Main.cpp

 /* 设计模式之计算器 比如: 加 减 乘 除 */
#include<iostream>
#include"Calc.h"
#include"Method.h"
#include<stdio.h> using namespace std; int main(int argv ,char args [] ) { calc<double,int > mycalc;
printf("hello the worlkd !! \n");
mycalc.show(,4.0,);
getchar();
return ;
}

这种模式其实跟我们说所的继承差不离,但是继承只是一个语言功能,而这种模式是分配调度.....两者存在本质上的不同、就如上面的例子而言,其加减乘除全部是来自另一个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 ) = ; };
#endif

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

 //  Roler.cpp

 #include "Roler.h"
#include "Game.h"
#include<iostream>
//构造函数
Roler::Roler() { } //析构函数
Roler::~Roler() { } //角色具体化
bigGame * Roler::PlayShow() {
//std::cout << "小前锋" << std::endl;
return new bigGame("小前锋");
} // Team.cpp #include "Team.h"
Team::Team() {}
Team::~Team() {} // Main.cpp #include"Roler.h"
#include"Team.h"
#include<iostream>
using namespace std; int main(int args , char argv[]) { Roler myrole;
bigGame *my = myrole.PlayShow();
my->famous_Role();
getchar();
return ;
}

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

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

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

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

  1. 设计模式学习系列6 原型模式(prototype)

    原型模式(prototype)用原型实例指定创建对象的种类,并且通过拷贝这些原型创建新的对象.允许一个对象再创建另外一个新对象的时候根本无需知道任何创建细节,只需要请求圆形对象的copy函数皆可. 1 ...

  2. Java-马士兵设计模式学习笔记-总结

    <马士兵设计模式学习>学习了以下模式: 1.装饰者模式(例子:水管工,木工) 2.策略模式(例子:老师用职称比大小.学生用成绩比大小) 3.简单工厂模式(例子:VechileFactory ...

  3. Java设计模式学习资源汇总

    本文记录了Java设计模式学习书籍.教程资源.此分享会持续更新: 1. 设计模式书籍 在豆瓣上搜索了一把,发现设计模式贯穿了人类生活的方方面面.还是回到Java与程序设计来吧. 打算先归类,再浏览,从 ...

  4. python之路,Day24 常用设计模式学习

    python之路,Day24 常用设计模式学习   本节内容 设计模式介绍 设计模式分类 设计模式6大原则 1.设计模式介绍 设计模式(Design Patterns) --可复用面向对象软件的基础 ...

  5. 设计模式学习--复合模式(Compound Pattern)

    设计模式学习--复合模式(Compound Pattern) 概述 ——————————————————————————————————————————————————— 2013年8月4日<H ...

  6. 北京设计模式学习组bjdp.org第7次活动(2013.08.04)回顾会纪要

    时间:2013.08.04,9am-7pm 地点:北京龙泉寺(北京凤凰岭风景区内) 参加人数:北京龙泉寺信息中心(20人).北京设计模式学习组(9人) 活动要点: 1)寺院巡礼:义工师兄带领参观寺院. ...

  7. 设计模式学习--Factory Method

    What Factory Method:定义一个创建对象的接口,让子类来决定实例化哪一个类.Factory Method使一个类的实例化延迟到其子类. Why Factory Method是一个比較基 ...

  8. Java设计模式学习总结

    设计模式基础学习总结 这篇总结主要是基于我之前设计模式基础系列文章而形成的的.主要是把重要的知识点用自己的话说了一遍,可能会有一些错误,还望见谅和指点.谢谢 更多详细内容可以查看我的专栏文章:设计模式 ...

  9. Java设计模式学习记录-模板方法模式

    前言 模板方法模式,定义一个操作中算法的骨架,而将一些步骤延迟到子类中.使得子类可以不改变一个算法的结构即可重新定义该算法的某些特定步骤. 模板方法模式 概念介绍 模板方法模式,其实是很好理解的,具体 ...

  10. Java设计模式学习记录-状态模式

    前言 状态模式是一种行为模式,用于解决系统中复杂的对象状态转换以及各个状态下的封装等问题.状态模式是将一个对象的状态从该对象中分离出来,封装到专门的状态类中,使得对象的状态可以灵活多变.这样在客户端使 ...

随机推荐

  1. R语言画图基础参数设置

    Graphical Parameters You can customize many features of your graphs (fonts, colors, axes, titles) th ...

  2. MyBatis Mapper 接口如何通过JDK动态代理来包装SqlSession 源码分析

    我们以往使用ibatis或者mybatis 都是以这种方式调用XML当中定义的CRUD标签来执行SQL 比如这样 <?xml version="1.0" encoding=& ...

  3. Fully differential amplifiers

    Introduction       专业音频工程师通常使用术语“平衡”来指代差分信号传输.这也告知了我们对称的概念,同时它在差分系统中也是非常重要的.在差分系统中,驱动器有平衡的输出,传输线有平衡的 ...

  4. JAVA排序--[选择排序]

    package com.array; public class Sort_Select { /** * 项目名称:选择排序 ; * 项目要求:用JAVA对数组进行排序,并运用选择排序算法; * 作者: ...

  5. idea编辑器HttpServlet httpServlet = ServletActionContext.getServletContext().getRealPath();方法无法使用

    HttpServlet httpServlet = ServletActionContext.getServletContext().getRealPath(); 前几天在使用idea的时候发现这个方 ...

  6. Java敏捷数据库迁移框架——Flyway

    1.引言 想到要管理数据库的版本,是在实际产品中遇到问题后想到的一种解决方案,当时各个环境的数据库乱作一团,没有任何一个人(开发.测试.维护人员)能够讲清楚当前环境下的数据库是哪个版本,与哪个版本的应 ...

  7. iOS - Threads 多线程

    1.Threads 1.1 进程 进程是指在系统中正在运行的一个应用程序.每个进程之间是独立的,每个进程均运行在其专用且受保护的内存空间内. 比如同时打开 QQ.Xcode,系统就会分别启动两个进程. ...

  8. java或者jsp中修复会话标识未更新漏洞

    AppScan会扫描“登录行为”前后的Cookie,其中会对其中的JSESSIONOID(或者别的cookie id依应用而定)进行记录.在登录行为发生后,如果cookie中这个值没有发生变化,则判定 ...

  9. MonkeyRunner学习(3)脚本编辑

    除了cmd直接操作手机,也可以编辑好脚本后,运行脚本,一次操作多个脚本命令 a) 新建py格式脚本,如iReader.py b) 编辑脚本 #导入模块 from com.android.monkeyr ...

  10. Linux系统/etc/init.d目录

    理解Linux系统/etc/init.d目录和/etc/rc.local脚本 http://blog.csdn.net/acs713/article/details/7322082 Linux文件目录 ...