根据系列博客的第一篇设计模式-01-设计模式简介及分类对24设计模式的分类,本文对第一类—–创建型模式,进行举例分析

一.工厂模式

修正了简单工厂模式中不遵守开放-封闭原则。工厂方法模式把选择判断移到了客户端去实现,如果想添加新功能就不用修改原来的类,直接修改客户端即可

代码举例:

#include <string>
#include <iostream>
using namespace std;
//实例基类,相当于Product(为了方便,没用抽象)
class LeiFeng
{
public:virtual void Sweep(){cout<<"雷锋扫地"<<endl;}
};//学雷锋的大学生,相当于ConcreteProduct
class Student: public LeiFeng
{
public:virtual void Sweep(){cout<<"大学生扫地"<<endl;}
};//学雷锋的志愿者,相当于ConcreteProduct
class Volenter: public LeiFeng
{
public :virtual void Sweep(){cout<<"志愿者"<<endl;}
};
//工场基类Creator
class LeiFengFactory
{
public:virtual LeiFeng* CreateLeiFeng(){return new LeiFeng();}
};
//工场具体类
class StudentFactory : public LeiFengFactory
{
public :virtual LeiFeng* CreateLeiFeng(){return new Student();}
};
class VolenterFactory : public LeiFengFactory
{
public:virtual LeiFeng* CreateLeiFeng(){return new Volenter();}
};
//客户端
int main()
{LeiFengFactory *sf=new LeiFengFactory();LeiFeng *s=sf->CreateLeiFeng();s->Sweep();delete s;delete sf;return 0;
}

二.抽象工厂模式

定义了一个创建一系列相关或相互依赖的接口,而无需指定它们的具体类。
用于交换产品系列,如ACCESS->SQL SERVER;产品的具体类名被具体工厂的实现分离

代码举例:

#include <string>
#include <iostream>
#include <vector>
using namespace std;//用户抽象接口
class IUser
{
public :virtual void GetUser()=0;virtual void InsertUser()=0;
};//部门抽象接口
class IDepartment
{
public:virtual void GetDepartment()=0;virtual void InsertDepartment()=0;
};//ACCESS用户
class CAccessUser : public IUser
{
public:virtual void GetUser(){cout<<"Access GetUser"<<endl;}virtual void InsertUser(){cout<<"Access InsertUser"<<endl;}
};//ACCESS部门
class CAccessDepartment : public IDepartment
{
public:virtual void GetDepartment(){cout<<"Access GetDepartment"<<endl;}virtual void InsertDepartment(){cout<<"Access InsertDepartment"<<endl;}
};//SQL用户
class CSqlUser : public IUser
{
public:virtual void GetUser(){cout<<"Sql User"<<endl;}virtual void InsertUser(){cout<<"Sql User"<<endl;}
};//SQL部门类
class CSqlDepartment: public IDepartment
{
public:virtual void GetDepartment(){cout<<"sql getDepartment"<<endl;}virtual void InsertDepartment(){cout<<"sql insertdepartment"<<endl;}
};//抽象工厂
class IFactory
{
public:virtual IUser* CreateUser()=0;virtual IDepartment* CreateDepartment()=0;
};//ACCESS工厂
class AccessFactory : public IFactory
{
public:virtual IUser* CreateUser(){return new  CAccessUser();}virtual IDepartment* CreateDepartment(){return new CAccessDepartment();}
};//SQL工厂
class SqlFactory : public IFactory
{
public:virtual IUser* CreateUser(){return new  CSqlUser();}virtual IDepartment* CreateDepartment(){return new CSqlDepartment();}
};客户端:
int main()
{IFactory* factory= new SqlFactory();IUser* user=factory->CreateUser();IDepartment* depart = factory->CreateDepartment();user->GetUser();depart->GetDepartment();return 0;
}

三.单例模式

保证一个类仅有一个实例,并提供一个访问它的全局访问点

代码举例:

#include <iostream>
#include <string>
#include <vector>
using namespace std;class Singelton
{
private:Singelton(){}static Singelton* singel;public:static Singelton* GetInstance(){if(singel == NULL){singel = new Singelton();}return singel;}};
Singelton* Singelton::singel = NULL;//注意静态变量类外初始化客户端:
int main()
{Singelton* s1=Singelton::GetInstance();Singelton* s2=Singelton::GetInstance();if(s1 == s2)cout<<"ok"<<endl;elsecout<<"no"<<endl;return 0;
}

四.建造者模式

在当创建复杂对象的算法应该独立于该对象的组成部分以及它们的装配方式时适用。

代码举例:

//例一
#include <string>
#include <iostream>
#include <vector>
using namespace std;//最终的产品类
class Product
{
private:vector<string> m_product;
public:void Add(string strtemp){m_product.push_back(strtemp);}void Show(){vector<string>::iterator p=m_product.begin();while (p!=m_product.end()){cout<<*p<<endl;p++;}}
};//建造者基类
class Builder
{
public:virtual void BuilderA()=0;virtual void BuilderB()=0;virtual Product* GetResult()=0;
};
//第一种建造方式
class ConcreteBuilder1 : public Builder
{
private:Product* m_product;
public:ConcreteBuilder1(){m_product=new Product();}virtual void BuilderA(){m_product->Add("one");}virtual void BuilderB(){m_product->Add("two");}virtual Product* GetResult(){return m_product;}
};
//第二种建造方式
class ConcreteBuilder2 : public Builder
{
private:Product * m_product;
public:ConcreteBuilder2(){m_product=new Product();}virtual void BuilderA(){m_product->Add("A");}virtual void BuilderB(){m_product->Add("B");}virtual Product* GetResult(){return m_product;}
};//指挥者类
class Direct
{
public:void Construct(Builder* temp){temp->BuilderA();temp->BuilderB();}
};//客户端
int main()
{Direct *p=new Direct();Builder* b1=new ConcreteBuilder1();Builder* b2=new ConcreteBuilder2();p->Construct(b1);     //调用第一种方式Product* pb1=b1->GetResult();pb1->Show();p->Construct(b2);          //调用第二种方式Product * pb2=b2->GetResult();pb2->Show();return 0;
}
//例二
#include <string>
#include <iostream>
#include <vector>
using namespace std;class Person
{
public:virtual void CreateHead()=0;virtual void CreateHand()=0;virtual void CreateBody()=0;virtual void CreateFoot()=0;
};
class ThinPerson : public Person
{
public:virtual void CreateHead(){cout<<"thin head"<<endl;}virtual void CreateHand(){cout<<"thin hand"<<endl;}virtual void CreateBody(){cout<<"thin body"<<endl;}virtual void CreateFoot(){cout<<"thin foot"<<endl;}
};class ThickPerson : public Person
{
public:virtual void CreateHead(){cout<<"ThickPerson head"<<endl;}virtual void CreateHand(){cout<<"ThickPerson hand"<<endl;}virtual void CreateBody(){cout<<"ThickPerson body"<<endl;}virtual void CreateFoot(){cout<<"ThickPerson foot"<<endl;}
};
//指挥者类
class Direct
{
private:Person* p;
public:Direct(Person* temp) { p = temp;}void Create(){p->CreateHead();p->CreateBody();p->CreateHand();p->CreateFoot();}
};//客户端代码:
int main()
{Person *p=new ThickPerson();Direct *d= new Direct(p);d->Create();delete d;delete p;return 0;
}

五.原型模式

从一个对象再创建另外一个可定制的对象,而无需知道任何创建的细节。并能提高创建的性能。 说白了就COPY技术,把一个对象完整的COPY出一份。

代码举例:

#include<iostream>
#include <vector>
#include <string>
using namespace std;class Prototype //抽象基类
{
private:string m_strName;
public: Prototype(string strName){ m_strName = strName; }Prototype() { m_strName = " "; }void Show() {cout<<m_strName<<endl;}virtual Prototype* Clone() = 0 ;
} ; // class ConcretePrototype1
class ConcretePrototype1 : public Prototype
{
public: ConcretePrototype1(string strName) : Prototype(strName){}ConcretePrototype1(){}virtual Prototype* Clone() { ConcretePrototype1 *p = new ConcretePrototype1() ; *p = *this ; //复制对象 return p ; }
} ; // class ConcretePrototype2
class ConcretePrototype2 : public Prototype
{
public: ConcretePrototype2(string strName) : Prototype(strName){}ConcretePrototype2(){}virtual Prototype* Clone() { ConcretePrototype2 *p = new ConcretePrototype2() ; *p = *this ; //复制对象 return p ; }
} ; //客户端
int main()
{ConcretePrototype1* test = new ConcretePrototype1("小王");ConcretePrototype2* test2 = (ConcretePrototype2*)test->Clone();test->Show();test2->Show();return 0;
}

设计模式-02-创建型模式详解相关推荐

  1. 走穿java23种设计模式-15责任链模式详解

    走穿java23种设计模式-15责任链模式详解 责任链模式是一种常见的行为模式. 一.责任链模式的现实场景 习伟过生日邀请了很多朋友到KTV一起庆祝,为了增加欢乐的气氛,习伟建议大家一起玩击鼓传花的游 ...

  2. 走穿java23种设计模式--18中介者模式详解

    走穿java23种设计模式–18中介者模式详解 中介者模式也称调停者模式,是一种比较简单的模式. 一.中介者模式的现实场景 蔡良因为上次表白时对方只看重他的物质方面,所以他对女朋友这个问题有点失望.因 ...

  3. 设计模式之创建型模式(工厂、原型、建造者)

    文章目录 创建型模式 2.1 工厂设计模式 2.1.1 简单工厂模式 2.1.2 工厂方法模式 2.1.3 抽象工厂 2.1.4 工厂模式总结 2.1.5 Spring中的工厂模式 2.1.6 工作中 ...

  4. 设计模式之享元模式详解

    设计模式之享元模式详解 概述 享元模式定义: ​ 运用共享技术来有效地支持大量细粒度对象的复用.它==通过共享已经存在的对象来大幅度减少需要创建的对象数量==.避免大量相似对象的开销,从而提高系统资源 ...

  5. 设计模式之装饰器模式详解

    设计模式之装饰器模式详解 文章目录 设计模式之装饰器模式详解 一.什么是装饰器模式 二.装饰器模式的角色组成 三.装饰器模式通用写法示例 四.装饰器模式业务中的应用举例 五.装饰器模式优缺点 一.什么 ...

  6. java设计模式中不属于创建型模式_23种设计模式第二篇:java工厂模式定义:工厂模式是 Java 中最常用的设计模式之一。这种类型的设计模式属于创建型模式,它提供了一种创建对象的最佳方式...

    23种设计模式第二篇:java工厂模式 定义: 工厂模式是 Java 中最常用的设计模式之一.这种类型的设计模式属于创建型模式,它提供了一种创建对象的最佳方式. 工厂模式主要是为创建对象提供过渡接口, ...

  7. Java学习--设计模式之创建型模式

    一.简介 创建型模式:这些设计模式提供了一种在创建对象的同时隐藏创建逻辑的方式,而不是使用 new 运算符直接实例化对象.这使得程序在判断针对某个给定实例需要创建哪些对象时更加灵活.创建型模式包括:工 ...

  8. 备战面试日记(3.2) - (设计模式.23种设计模式之创建型模式)

    本人本科毕业,21届毕业生,一年工作经验,简历专业技能如下,现根据简历,并根据所学知识复习准备面试. 记录日期:2022.1.6 大部分知识点只做大致介绍,具体内容根据推荐博文链接进行详细复习. 文章 ...

  9. GOF23设计模式(创建型模式)工厂模式

    目录: 一:工厂模式的核心本质 二:关于面向对象的六大基本原则 三:工厂模式的三大类详解(代码示例,详细分析) 首先,上咱本GOF23所有工厂模式的分类表格!!! 创建型模式 单例模式.工厂模式.抽象 ...

  10. getinstance方法详解_二、设计模式总览及工厂模式详解

    二.架构师内功心法之设计模式 2.架构师内功心法之设计模式 2.1.课程目标 1.通过对本章内容的学习,了解设计模式的由来. 2.介绍设计模式能帮我们解决哪些问题. 3.剖析工厂模式的历史由来及应用场 ...

最新文章

  1. 如何拼通网络ip地址_如何解决IP地址冲突
  2. 记一次接收微信公众平台推送消息的实例
  3. 网站负责人委托书_关于网站负责人授权委托书的阿里云网站内容
  4. 怎样检查计算机的网络配置,如何检查计算机内存和配置?(3种方法教你检查计算机的真实配置)...
  5. google code for xbmc addons2
  6. STM32 Flash详解
  7. 如何停止Linux系统中占用CPU 100%的进程
  8. querySelector() 选择器语法
  9. (转)招行推出的摩羯智能理财,到底是在做什么?
  10. 用计算机制作个人简历图片,计算机应用基础制作个人简历.ppt
  11. 【百度一键分享功能】百度一键分享插件
  12. (阅读笔记)3DRA和CTA脑动脉瘤分割方法与评价
  13. 【JAVA笔记】JAVA调用同一个包里的不同类的方法:
  14. java引用不同包下同名类_Java--一个类中引用不同包下同名类
  15. c++代码实现我的世界
  16. android背景气泡,仿Android微信消息气泡
  17. 基于SpringBoot2的房屋租赁系统的设计与实现-计算机、软件工程、网络工程等专业毕设
  18. Java复习总结之快速区分值传递和引用传递
  19. 调用织梦DedeCMS当前栏目名称和栏目链接地址的方法
  20. 还在找一键换发型app?快来看这些一键换发型软件

热门文章

  1. 邮件合并保存为一个个单独的文档_你还在为考计算机二级烦恼吗? 基本操作步骤分享...
  2. 剑三哪些插件是必备的_日常学习、办公必备的浏览器插件丨附安装教程(三)...
  3. NVM:使用NVM后报错npm:command not found
  4. Idea:新版本Idea底部工具栏Git中没有Local Changes
  5. 解决npm安装时出现run `npm audit fix` to fix them, or `npm audit` for details
  6. 随手记_重建的五花八门的点云地图效果(供娱乐)
  7. TIF图片转bitmap的两种方式(C#)
  8. karto探秘之open_karto 第三章 --- 扫描匹配
  9. 输入一个矩阵,按照从外向里以顺时针的顺序依次打印出每一个数字,例如,如果输入如下4 X 4矩阵: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 则依次打印出数字1,2,
  10. XGBoost算法原理