十二种设计模式

本文详细介绍了设计模式,包括工厂模式、单例模式、原型模式等十二种常见设计模式,探讨了它们的作用、应用场景及优缺点,旨在帮助开发者更好地理解和运用设计模式,提升软件设计的灵活性和可维护性。

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

目录

1 设计模式概述

2 工厂模式

3 单例模式

4 原型模式

5 桥接模式

6 适配器模式

7 装饰器模式

8 组合模式

9 门面模式

10 代理模式

11 策略模式

12 状态模式

13 职责链模式


1 设计模式概述

作用:

        面向对象系统的分析和设计实际上在追求两点:高内聚(Cohesion)低耦合(Coupling)。因此,无论是封装、继承、多态还是设计模式都是为了这两个目标在努力。

设计模式体现的是一种思想,而思想是指导行为的一切,设计模式可以指导程序员设计和开发。

设计模式分类:

2 工厂模式

两个最重要的功能:

1)定义创建对象的接口,封装对象的创建;

2)使得具体化类的工作延迟到子类中。

应用:买车,不需要知道车是怎么造出来的、要哪个产品工厂给哪个产品,不需要知道产品怎么制造。

 

#include<stdio.h>
#include<iostream>
 
using namespace std;
 
class Product{
public:
	virtual void Do()=0;  //纯虚函数
	virtual ~Product()    //虚析构
        {
		cout<<"Product is destructed!"<<endl;
	}
};
 
class ProductA:public Product{   //公有继承,每个子类中都有Do成员方法
public:
	void Do(){
		cout<<"正在制造ProductA!"<<endl;
	}
};
 
class ProductB:public Product{  //公有继承
public:
	void Do(){
		cout<<"正在制造ProductB!"<<endl;
	}
};
 
class ProductC:public Product{  //公有继承
public:
	void Do(){
		cout<<"正在制造ProductC!"<<endl;
	}
};
 
class Factory{          //工厂类
private:
	Product *product;     //私有的工厂类指针
public:
	Factory(int n)        //Factory有参构造
        {
	     switch(n){       //switch-case语句确定构造哪个产品对象
                case1: product=new ProductA();
	           break;
                case2: product=new ProductB();
	           break;
                case3: product=new ProductC();
	           break;
	     }
	}
	void send()      //调用Do函数
	{
		product->Do();
	}
	~Factory(){      //析构
		delete product;
	}
};
 
int main()
{
	Factory *factory=new Factory(2);
	factory->send();
	return 0;
}

代码说明:示例代码给出的是Factory模式解决父类不知道具体实例化哪一个具体子类的问题,让其子类实现工厂接口,返回的也是一个抽象的产品。

将Factory的有参构造中的switch-case语句变为Product类指针。

#include<stdio.h>
#include<iostream>
 
using namespace std;
 
class Product{
public:
	virtual void Do()=0;
	virtual ~Product(){
		cout<<"Product is destructed!"<<endl;
	}
};
 
class ProductA:public Product{
public:
	void Do(){
		cout<<"正在制造ProductA!"<<endl;
	}
};
 
class ProductB:public Product{
public:
	void Do(){
		cout<<"正在制造ProductB!"<<endl;
	}
};
 
class ProductC:public Product{
public:
	void Do(){
		cout<<"正在制造ProductC!"<<endl;
	}
};
 
class Factory{
private:
	Product *product;
public:
	Factory(Product *t){
		product=t;
	}
	void send()
	{
		product->Do();
	}
	~Factory(){
		delete product;
	}
};
 
int main(void)
{
	Factory *factory=new Factory(new ProductB());
	factory->send();
	return 0;
}

增加多个Factory和Product类:

#include<stdio.h>
#include<iostream>
 
using namespace std;
 
class Product{
public:
	virtual void Do()=0;
	virtual ~Product(){
		cout<<"Product is destructed!"<<endl;
	}
};
 
class ProductA:public Product{
public:
	void Do(){
		cout<<"正在制造ProductA!"<<endl;
	}
};
 
class ProductB:public Product{
public:
	void Do(){
		cout<<"正在制造ProductB!"<<endl;
	}
};
 
class ProductC:public Product{
public:
	void Do(){
		cout<<"正在制造ProductC!"<<endl;
	}
};
 
class Factory{
protected:
	Product *product;
public:
	virtual void send()=0;
	virtual ~Factory(){}
};
 
class FactoryA: public Factory{
public:
	FactoryA(Product *t)
	{
		product=t;
	}
	void send()
	{
		product->Do();
	}
};
 
class FactoryB: public Factory{
public:
	FactoryB(Product *t)
	{
		product=t;
	}
	void send()
	{
		product->Do();
	}
};
 
class FactoryC: public Factory{
public:
	FactoryC(Product *t)
	{
		product=t;
	}
	void send()
	{
		product->Do();
	}
};
 
int main(void)
{
	Factory *factory=new Factory(new PruductA());
	factory->send();
	return 0;
}

 工厂模式的优点:  1)面向接口编程,体现了面向对象的思想;

                                2)将创建对象的工作转移到了工厂类。

3 单例模式

目的:创建唯一一个对象实例。

通过维护一个static的成员变量来记录这个唯一的对象实例,通过提供一个static的接口instance来获得这个唯一的实例。

举例:一个国家的主席、一个班的班主任等。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值