创建型模式

23种设计模式-创建型模式 工厂方法模式(Factory Method Pattern)是创建型设计模式的一种,它提供了一种创建对象的最佳方式。在工厂方法模式中,对象的创建是通过调用一个工厂方法而不是直接调用构造器来完成的。这个工厂方法可以是指定的接口并由子类实现,或者是类的抽象方法。定义工厂方法模式定义了一个创建对象的接口,让子类决定实例化哪一个类。工厂方法使一个类的实例化延迟到其子类。涉及到的关键类或接口Product(产品角色):定义工厂方法所创建的对象的接口。ConcreteProduct(具体产品角色) 阅读详情

单例模式

懒汉式

#include<iostream>
using namespace std;

// 懒汉式
class SingleTon
{
public:
	static SingleTon* m_singleTon;		// 静态指针
	static SingleTon* GetInstance()		// 提供静态方法,用来获得对象
	{
		if (m_singleTon == NULL)
		{
			m_singleTon = new SingleTon;
		}
		return m_singleTon;
	}

	void test()
	{
		cout << "成功调用了对象{" << this << "}的方法" << endl;
	}

private:
	SingleTon()		// 构造函数私有化
	{
		cout << "构造了一个对象" << endl;
	}
};


SingleTon* SingleTon::m_singleTon = NULL;

int main()
{
	// SingleTon obj;		// 报错,无法直接创建对象

	SingleTon* obj1 = SingleTon::GetInstance();	// 创建对象
	obj1->test();

	SingleTon* obj2 = SingleTon::GetInstance();	// 创建对象
	obj2->test();


	delete obj1;	// 或者 delete obj2;		obj1 和 obj2 两者指向同一个对象

	system("pause");
	return 0;
}

饿汉式

#include<iostream>
using namespace std;

// 饿汉式
class SingleTon
{
public:
	static SingleTon* m_singleTon;		// 静态指针
	static SingleTon* GetInstance()		// 提供静态方法,用来获得对象
	{
		return m_singleTon;
	}

	void test()
	{
		cout << "成功调用了对象{" << this << "}的方法" << endl;
	}

private:
	SingleTon()		// 构造函数私有化
	{
		cout << "构造了一个对象" << endl;
	}
};


SingleTon* SingleTon::m_singleTon = new SingleTon();

int main()
{
	SingleTon* obj1 = SingleTon::GetInstance();	// 创建对象
	obj1->test();

	SingleTon* obj2 = SingleTon::GetInstance();	// 创建对象
	obj2->test();


	delete obj1;	// 或者 delete obj2;		obj1 和 obj2 两者指向同一个对象

	system("pause");
	return 0;
}

工厂模式

简单工厂模式

#include<iostream>
using namespace std;

/*
	1. 提供一个工厂类:产生不同的产品
	2. 提供一个抽象产品类:运算符类 + 负责运算,得到结果
	3. 提供一个具体产品类:具体运算符
	// 简单计算器 + - * /
*/

// 抽象产品类
class Operation
{
public:
	double m_leftValue;
	double m_rightValue;
	virtual double GetResult() = 0;
	virtual ~Operation() {};
};

// 具体产品类
// 加法运算
class AddOperation :public Operation
{
	double GetResult()
	{
		return m_leftValue + m_rightValue;
	}
};
// 减法运算
class SubOperation :public Operation
{
	double GetResult()
	{
		return m_leftValue - m_rightValue;
	}
};
// 乘法运算
class MulOperation :public Operation
{
	double GetResult()
	{
		return m_leftValue * m_rightValue;
	}
};
// 除法运算
class DivOperation :public Operation
{
	double GetResult()
	{
		return m_leftValue / m_rightValue;
	}
};

// 工厂类
class OperationFactory
{
public:
	static Operation* createOperation(char c)
	{
		switch (c)
		{
		case '+':
			return new AddOperation;
		case '-':
			return new SubOperation;
		case '*':
			return new MulOperation;
		case '/':
			return new DivOperation;
		default:
			break;
		}
	}
};


int main()
{
	Operation* add = OperationFactory::createOperation('+');
	Operation* sub = OperationFactory::createOperation('-');
	Operation* mul = OperationFactory::createOperation('*');
	Operation* div = OperationFactory::createOperation('/');

	// 乘法
	mul->m_leftValue = 10;		// 设置左值
	mul->m_rightValue = 30;		// 设置右值
	cout << mul->GetResult() << endl;	// 输出相乘结果: 300


	delete add;
	delete sub;
	delete mul;
	delete div;

	system("pause");
	return 0;
}

工厂方法模式

#include<iostream>
using namespace std;


// ------------------- 产品 -------------------

// 抽象产品
class AbstractProduct
{
public:
	virtual void fuel() = 0;		// 此产品能补充燃料
	virtual void fly() = 0;			// 此产品能飞
	virtual ~AbstractProduct() {};
};

// 飞机产品
class PlaneProduct : public AbstractProduct
{
public:
	void fuel()
	{
		cout << "飞机-CS1024,补充燃料中..." << endl;
	}

	void fly()
	{
		cout << "飞机-CS1024,起飞!" << endl;
	}
};

// 火箭产品
class RocketProduct : public AbstractProduct
{
public:
	void fuel()
	{
		cout << "火箭-CS2048,补充燃料中..." << endl;
	}

	void fly()
	{
		cout << "火箭-CS2048,点火!" << endl;
	}
};

// ------------------- 工厂 -------------------

// 抽象工厂
class AbstractFactory
{
public:
	virtual AbstractProduct* CreateProduct() = 0;
	virtual ~AbstractFactory() {};
};

// 飞机工厂
class PlaneFactory : public AbstractFactory
{
public:
	AbstractProduct* CreateProduct()
	{
		return new PlaneProduct();
	}
};

// 火箭工厂
class RocketFactory : public AbstractFactory
{
public:
	AbstractProduct* CreateProduct()
	{
		return new RocketProduct();
	}
};

void work(AbstractFactory* factory)
{
	// 工厂干的活是:

	// 1. 生产出产品
	AbstractProduct* product = factory->CreateProduct();

	// 2. 使用该产品的"补充燃料"的功能
	product->fuel();

	// 2. 使用该产品的"飞行"的功能
	product->fly();

	delete factory;
}

int main()
{
	work(new PlaneFactory);		// 让飞机工厂干活
	work(new RocketFactory);	// 让火箭工厂干活

	system("pause");
	return 0;
}

抽象工厂模式

#include<iostream>
using namespace std;

// 抽象产品
class Product
{
public:
	virtual void show() = 0;
	virtual ~Product() {};
};

// 抽象键盘产品
class KeyBoard : public Product
{
public:
	virtual ~KeyBoard() {};
};

// 具体键盘产品
class MikaKeyBoard : public KeyBoard
{
public:
	void show()
	{
		cout << "Mika键盘" << endl;
	}
};
class PikiKeyBoard : public KeyBoard
{
public:
	void show()
	{
		cout << "Piki键盘" << endl;
	}
};

// 抽象鼠标产品
class Mouse : public Product
{
public:
	virtual ~Mouse() {};
};

// 具体鼠标产品
class MikaMouse : public Mouse
{
public:
	void show()
	{
		cout << "Mika鼠标" << endl;
	}
};
class PikiMouse : public Mouse
{
public:
	void show()
	{
		cout << "Piki鼠标" << endl;
	}
};

// 抽象工厂
class Factory
{
public:
	virtual KeyBoard* CreateKeyBoard() = 0;
	virtual Mouse* CreateMouse() = 0;
	virtual ~Factory() {};
};

// 具体Mika工厂
class MikaFactory : public Factory
{
	KeyBoard* CreateKeyBoard()
	{
		return new MikaKeyBoard;
	}

	Mouse* CreateMouse()
	{
		return new MikaMouse;
	}
};

// 具体Piki工厂
class PikiFactory : public Factory
{
	KeyBoard* CreateKeyBoard()
	{
		return new PikiKeyBoard;
	}

	Mouse* CreateMouse()
	{
		return new PikiMouse;
	}
};

void work(Factory* factory)
{
	KeyBoard* keyboard = factory->CreateKeyBoard();			// 让工厂制造键盘
	Mouse* mouse = factory->CreateMouse();					// 让工厂制造鼠标
	keyboard->show();	// 查看键盘配置信息
	mouse->show();		// 查看鼠标配置信息

	delete factory;
}

int main()
{
	work(new MikaFactory());	// 创建一个Miki工厂,并让它开工
	work(new PikiFactory());	// 创建一个Piki工厂,并让它开工

	system("pause");
	return 0;
}

建造者模式

#include<iostream>
#include<string>
#include<vector>
using namespace std;

/*
	组装电脑:显示器、鼠标、键盘、主机
	1. 找到店铺老板告诉需求
	2. 客服安排技术员工组装
	3. 产品组装完成
*/

// 抽象产品
class AbstractProduct
{
public:
	virtual void SetDisplayer(string displayer) = 0;
	virtual void SetMouse(string mouse) = 0;
	virtual void SetKeyBoard(string keyboard) = 0;
	virtual void SetHost(string host) = 0;
	virtual void Show() = 0;
	virtual ~AbstractProduct() {};
};

// 具体产品(电脑)
class Computer : AbstractProduct
{
	void SetDisplayer(string displayer)
	{
		cout << "正在组装" << displayer << endl;
		m_computer.push_back(displayer);	// 模拟组装显示器的过程
	}

	void SetMouse(string mouse)
	{
		cout << "正在组装" << mouse << endl;
		m_computer.push_back(mouse);		// 模拟组装鼠标的过程
	}

	void SetKeyBoard(string keyboard)
	{
		cout << "正在组装" << keyboard << endl;
		m_computer.push_back(keyboard);		// 模拟组装键盘的过程
	}

	void SetHost(string host)
	{
		cout << "正在组装" << host << endl;
		m_computer.push_back(host);			// 模拟组装主机的过程
	}

	// 查看当前电脑组装了什么
	void Show()
	{
		cout << "电脑配置结果:" << endl;
		for (auto v : m_computer)
		{
			cout << v << endl;
		}
	}

	vector<string> m_computer;		// 模拟空壳电脑
};

// 抽象建造者
class AbstractBuilder
{
public:
	// 构造函数 (默认构造一个建造者时,就随之产生一个空壳产品,并要求建造者组装好这个产品)
	AbstractBuilder()
	{
		this->m_product = (AbstractProduct*) new Computer;
	}

	// 抽象建造者组装零件的动作
	virtual void assembleDisplayer(string displayer) = 0;
	virtual void assembleMouse(string mouse) = 0;
	virtual void assembleKeyBoard(string keyboard) = 0;
	virtual void assembleHost(string host) = 0;

	AbstractProduct* GetProduct()
	{
		return m_product;	// 返回"已组装或未组装"好的产品
	}

	virtual ~AbstractBuilder() {};

protected:
	AbstractProduct* m_product;		// 空壳产品
};

// 具体建造者(技术员工)
class Technician : AbstractBuilder
{
	// 让技术员工组装显示器
	void assembleDisplayer(string displayer)
	{
		this->m_product->SetDisplayer(displayer);
	}

	// 让技术员工组装鼠标
	void assembleMouse(string mouse)
	{
		this->m_product->SetMouse(mouse);
	}

	// 让技术员工组装键盘
	void assembleKeyBoard(string keyboard)
	{
		this->m_product->SetKeyBoard(keyboard);
	}

	// 让技术员工组装主机
	void assembleHost(string host)
	{
		this->m_product->SetHost(host);
	}
};

// 老板
class Boss
{
public:
	// 构造函数(默认构造一个老板时,就要求老板管理一个员工)
	Boss(AbstractBuilder* technician)
	{
		this->m_technician = technician;
	}

	// 让员工组装 -- Let employees assemble
	void letEmployeeAssemble(string displayer, string mouse, string keyBoard, string host)
	{
		// 调用员工的组装功能
		this->m_technician->assembleDisplayer(displayer);
		this->m_technician->assembleMouse(mouse);
		this->m_technician->assembleKeyBoard(keyBoard);
		this->m_technician->assembleHost(host);
	}

private:
	AbstractBuilder* m_technician;	// 技术人员
};

int main()
{
	// 实例一个技术人员,作为员工
	AbstractBuilder* technician = (AbstractBuilder*) new Technician;

	// 实例一个老板,管理上面的技术人员
	Boss* boss = new Boss(technician);

	// 老板让员工组装 "Miki显示器", "PoPo鼠标", "Jinna键盘", "BiGong主机"
	boss->letEmployeeAssemble("Miki显示器", "PoPo鼠标", "Jinna键盘", "BiGong主机");

	// 员工把组装好的(电脑)产品,交出来
	AbstractProduct* computer = technician->GetProduct();

	// 查看组装好以后的电脑的配置
	computer->Show();


	delete computer;
	delete boss;
	delete technician;

	system("pause");
	return 0;
}

原型模式

#include<iostream>
#include<string>
using namespace std;

// 孙悟空七十二变: 变成一颗树


// 原型
class Monkey
{
public:
	virtual Monkey* Clone() = 0;		// 克隆对象
	virtual void Show() = 0;			// 展示对象的内容
	virtual ~Monkey() {};
};

// 变化后
class Tree : Monkey
{
public:
	// 构造函数
	Tree(string name) : m_name(name)	// 列表初始化
	{
		;	// 空语句,仅为了占位
	}

	// 拷贝构造函数
	Tree(const Tree& obj)
	{
		this->m_name = obj.m_name;
	}

	// 展示内容
	void Show()
	{
		cout << m_name << endl;
	}

	// 克隆对象
	Monkey* Clone()
	{
		cout << "克隆成功!" << endl;
		return new Tree(*this);		// 调用拷贝构造函数,返回一个新对象
	}

private:
	string m_name;
};


int main()
{
	Tree* aTree = new Tree("菩提树");
	aTree->Show();

	Tree* bTree = (Tree*)aTree->Clone();
	bTree->Show();

	delete bTree;
	delete aTree;

	system("pause");
	return 0;
}

总结

创建型模式总结

  • 单例模式:创建一个全局的对象
  • 工厂方法模式:实现单个类的对象的创建
  • 抽象工厂模式:实现多个类的对象的创建
  • 建造者模式:实现复杂类的对象的创建
  • 原型模式:实现自身类的克隆
设计模式-创建型模式 目的:提供一个创建一系列相关或相互依赖对象的接口,而无需指定它们具体的类。应用场景:GUI工具包中,为不同的操作系统提供统一的界面元素创建机制。描述:提供一个接口,用于创建一系列相关或相互依赖的对象,而无需指定它们具体的类。核心思想:通过定义一个抽象层来创建一系列产品,而不是单一的产品。客户端代码使用的是由抽象工厂提供的接口,而不直接依赖于具体的产品类。优点:易于交换“系列产品”,因为具体工厂类在运行时被实例化;为大规模的产品设计提供了开放式的兼容性。// 抽象产品A// 具体产品A1。 阅读详情

相关推荐

设计模式之创建型5种

设计模式之所以被归纳为23种,而非其他数量,源于GoF(Gang of Four)在1994年的系统性总结和分类。

Marzlam的博客 1063

创建型模式总结

创建型模式有以下几个模式: 简单工厂:用来生产同一等级结构中的任意产品。(不支持拓展增加产品) 工厂方法 :用来生产同一等级结构中的固定产品。(支持拓展增加产品) 抽象工厂 :用来生产不同产品族的全部产品。(不支持拓展增加产品;支持增加产品族) 建造者模式:将建造人各个躯体的方法和躯体的具体数据分离开来,使得相同的方法,可以建立不同形态的人 原型模式:通过拷贝,可以将代码中...

李晨璐的博客 3406

USB2.0基础知识总结

目录 1、协议层: 1.1、域分类 1.2 、USB传输方式: 1、协议层: 域和包定义:包是一次传输的单位,每个包由多个域组成; USB中是按照LSB进行字节传输; 1.1、域分类 1.1.1: 同步域(SYNC field) 所有的包都开始于同步域,在低速和全速通信中SYNC field用7个0和1个1来表示。 由于USB2.0使用了NRZI编码(0用翻转来表示,1用不翻转表示),所以00000001就是上图那样。 ...

qq_32938605的博客 4408

《设计模式》创建型模式总结

首先,要明确这里所说的设计模式重点聚焦系统级的设计,系统本质上是一组类实例的组合,它区别于单一的类或者接口的设计,需要一定的抽象才能够使得后续的编码工作更有效率。创建型模式的最主要作用就是抽象了系统的实例化过程。在没有这种抽象之前,系统的实例化只是单纯的被看作是N个类的实例化,不利于后续的编码执行。这种抽象在大体上有两个实现的原则。其一是将系统所需要用到的各种类信息给封装起来;其二是把这些类的创建和组合方式也给隐藏起来。总之,整个系统有一套抽象的接口负责统一和外部对接。

weixin_50353846的博客 1446

IPC-7351标准实战:如何用LPWizard_10快速生成PCB封装库(附避坑指南)

本文提供了一份详细的IPC-7351标准实战指南,手把手教你使用LPWizard_10软件快速生成符合行业标准的PCB封装库,并直接导入Cadence Allegro。文章深入解读了IPC-7351密度等级的选择逻辑,并重点分享了软件配置、QFN封装生成实战步骤,以及导出失败、焊盘异常等常见问题的避坑解决方案,旨在帮助硬件工程师提升设计效率和可靠性。

weixin_29207439的博客 153

数据库:关系运算整理大全(包括关系代数、元组关系演算、域关系演算)

数据库关系运算: 1. 关系代数(基本关系代数、附加关系代数、扩展关系代数) 2. 元组关系演算 3. 域关系演算

ysji's blog 1万+

Java 创建型模式

Java 创建型模式 持续更新… 创建者模式的主要关注点是‘怎样创建对象?’,它的主要特点是‘将对象的创建和使用分离’。 这样可以降低系统的耦合度,使用者不需要关注对象的创建细节。 创建型模式分为: 单例模式 工厂方法模式 抽象工厂模式 原型模式 建造者模式 单例模式 单例模式时Java中最简单的设计模式之一。这种类型的设计模式属于创建型模式,它提供了一种出创建对象的最佳方式。 这种模式涉及到一个单一的类,该类负责创建自己的对象,同时确保只有单个对象被创建。这个类提供了一种访问其唯一的对象.

一夜星尘 5430

UDS服务应该支持哪些否定响应码

UDS服务应该支持哪些否定响应码所有服务都需支持的否定响应码具体的服务需要支持的否定响应码否定响应码定义及其取值 USD诊断服务的否定响应中包含有导致否定响应原因的编码,称为否定响应码(NRC, Negative Response Code)。否定响应码的取值范围为0x00 - 0xFF,被分为三组: 0x00:服务器内部实现否定响应码判断逻辑时使用,表示要给出肯定响应。 0x01 – 0x7F:诊断通信相关的否定响应码。 0x80 – 0xFF:服务器收到诊断服务请求时,由于某些条件不满足要求而给出的否定

闲聊汽车软件开发 4万+

设计模式——创建型模式

创建型模式是软件工程中常用的设计模式之一,主要关注对象的创建过程。创建型模式隐藏了对象创建的细节,而不是直接使用new操作符创建对象。

2301_79654063的博客 1403

CAPL实战:从零构建HEX文件解析器,赋能UDS刷写

本文详细介绍了如何使用CAPL从零构建HEX文件解析器,以支持UDS刷写操作。通过解析HEX文件格式、设计状态机、优化数据结构与算法,实现高效准确的固件数据处理,并提供了与UDS刷写流程对接的工程化实践建议。

weixin_28726391的博客 443

virtuoso:layout如何做flat修drc

有些drc在virtuoso layout中修更节省时间,比如遇到一些via array需要做删改时,发现工具把via array做成了一个cell,如图。去改cell可能会影响很多via,所以最好的办法是做flat,去调整cut,比如删除。我正在「拾陆楼」和朋友们讨论有趣的话题,你⼀起来吧?

m0_61544122的博客 342

设计模式之创建型模式详解

简单工厂模式(Simple Factory Pattern):又称为静态工厂方法(Static Factory Method)模式,它属于类创建型模式。在简单工厂模式中,可以根据参数的不同返回不同类的实例。简单工厂模式专门定义一个类来负责创建其他类的实例,被创建的实例通常都具有共同的父类。工厂方法模式(Factory Method Pattern)又称为工厂模式,也叫虚拟构造器(Virtual Constructor)模式或者多态工厂(Polymorphic Factory)模式,它属于类创建型模式。

zengchenAAA的博客 1768

beegfs源码分析

BeeGFS的客户端是由一个内核模块和两个系统服务组成的,这里咱们主要分析内核模块。由于BeeGFS的目录树解析,是在父目录DEntry里找子目录或文件DEntry,逐级迭代完成的,所以在Mount文件系统时,须要从管理节点获取根元数据节点的ID,而后再向根元数据节点查询根目录的DEntry的信息,为后续的目录解析打下基础。获取类似/data/beeond/data/dentries/38/51/root/#fSiDs#/文件fileId的父路径。1.1 FileID的生成。Session网络消息。

wfzy的博客 1913

设计模式--六种创建型模式

前言   每几种模式之间都有一定的联系,从中发现它们的相同点和不同点,研究发生改变的节点,这就是本篇博客所要说明的创建型设计模式之间的联系。它们包括:简单工厂模式、单例模式、工厂方法模式、抽象工厂模式、建造者模式和原型模式。 创建型模式的基本理解 创建型模式抽象了实例化过程。它们帮助一个系统独立于如何创建、组合和表示它的那些对象。 一个类创建型模式使用继承改变被实例

冯浩月 9638

Python 爬虫实战:淘宝直播间实时数据抓取(弹幕分析 + 流量监控)

随着电商直播的迅猛发展,淘宝直播已成为品牌推广和商品销售的重要阵地。通过爬取淘宝直播间的实时数据,包括弹幕互动和流量信息,可以帮助商家深入了解用户行为、优化直播策略,同时为市场分析和商业决策提供数据支持。本文将深入探讨如何利用 Python 爬虫技术实现对淘宝直播间实时数据的抓取,并进行弹幕分析和流量监控。

u014481728的博客 729

win10 跳过U8环境检测的IE WebControls.rar

win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。

设计模式之创建型模式

设计模式是软件开发中经过验证的可复用解决方案,它们源自实践、提炼于经验,并在面向对象编程中扮演着关键角色。GoF(Gang of Four)设计模式分为创建型、结构型和行为型三大类,共23种。设计模式的核心价值在于提高代码的可维护性、可扩展性和可复用性,同时遵循软件设计原则。

北_鱼的博客 894

Data-Structures-and-Algorithm-Analysis-in-Java.pdf

作者: Weiss, Mark A. 出版社: Addison Wesley Data Structures and Algorithm Analysis in Java is an “advanced algorithms” book that fits between traditional CS2 and Algorithms Analysis courses. In the old ACM Curriculum Guidelines, this course was known as CS7. This text is for readers who want to learn good programming and algorithm analysis skills simultaneously so that they can develop such programs with the maximum amo...

设计模式-创建型模式总结

创建型模式,顾名思义,就是用来创建对象的模式。它抽象了实例化过程,帮助一个系统独立于如何创建、组合和表示它的对象。

潘威威的博客 2558

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

上一篇: 前置知识储备
下一篇: 结构型模式
code_stream
博客等级 码龄4年 1238粉丝 169原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值