设计模式之原型模式-看我72变!

本文深入探讨了原型模式的概念、使用场景及构建方法,通过示例展示了如何利用该模式简化复杂对象的创建过程,提高效率,并分析了其优缺点。

一、原型模式的概念

原型模式是一种对象创建型模式, 它采取复制原型对象的方法来创建对象的实例,而不需要知道创建对象的细节过程,它是目标对象的一个“自我克隆”。

二、原型模式使用场景

1、创建一个对象的成本比较大时,可以考虑使用复制的方式获取一个新对象。

三、原型模式构建方法

1、抽象原型类

为具体原型提供一个统一抽象接口,需要具体原型类实现。

2、具体原型类

被复制的对象,需要实现抽象原型类中的统一接口。

四、原型模式的示例

// PrototypePattern.cpp : 此文件包含 "main" 函数。程序执行将在此处开始并结束。
//

#include <iostream>
#include <string>
using namespace std;
class Monkey
{
public:
	Monkey() {}
	virtual ~Monkey() {}
	virtual Monkey* clone() = 0;
	virtual void printName() = 0;
private:

};

class SunWuKong : public Monkey
{
public:
	SunWuKong(string nameStr)
	{
		m_nameStr = nameStr;
	}
	~SunWuKong() {}

	SunWuKong(const SunWuKong &other)
	{
		m_nameStr = other.m_nameStr;
	}

	Monkey* clone()
	{
		return new SunWuKong(*this);
	}
	void printName()
	{
		cout << m_nameStr << endl;
	}
private:
	string m_nameStr;
};

#define DELETE_PTR(p) {if(p!=nullptr){delete (p); (p)=nullptr;}}
int main()
{
	Monkey *pMonkey = new SunWuKong("QiTianDaSheng SunWuKong!");

	Monkey *pMonkey1 = pMonkey->clone();
	Monkey *pMonkey2 = pMonkey1->clone();

	pMonkey->printName();
	pMonkey1->printName();
	pMonkey2->printName();

	DELETE_PTR(pMonkey);
	DELETE_PTR(pMonkey1);
	DELETE_PTR(pMonkey2);
	
    std::cout << "Hello World!\n";
	getchar();
}

运行结果:
在这里插入图片描述

五、原型模式的优缺点

优点:

创建的对象比较复杂时,可以利用原型模式简化对象的创建过程,能够提高效率。
可以在程序运行时,获得一份内容相同的实例,且各个实例之间不会相互干扰。

缺点:

当实现深拷贝时,可能需要比较复杂的代码。
需要为每一个类配备克隆的方法,对一个新实现的类来说容易,对原有的类改造比较麻烦,需要全盘考虑。

能力有限,如有错误,多多指教。。。

<think>好的,我现在需要帮助用户了解Spring框架中的默认模式或配置。首先,用户提到的引用内容里提到了日志框架、设计模式、单例模式等,所以我要整合这些信息,给出一个清晰的回答。 首先,Spring的默认日志框架是logback,引用[1]中提到spring-boot-starter-logging已经被包含在starter里,所以默认不需要额外配置。这点需要放在日志配置部分。 然后是设计模式,用户引用[2]和[3]提到了单例模式和其他事件相关的设计模式。单例模式是Spring中bean的默认作用域,引用[4]里解释了为什么使用单例,主要是性能考虑。所以这里需要强调单例模式是默认的,同时提到其他设计模式如观察者模式(通过ApplicationEvent)和工厂模式(BeanFactory)。 接着是默认配置方面,比如依赖注入、自动装配,Spring Boot的自动配置特性。这部分需要结合常见的默认行为,比如组件扫描路径、默认数据源等。可能还需要提到MVC的默认设置,比如视图解析器。 另外,用户的问题可能还涉及到其他默认配置,比如事务管理是否是默认开启的,或者AOP的默认代理方式。不过根据提供的引用,可能需要集中在已知的信息上,避免推测。如果引用中没有提到的内容,可能需要不提及或者注明。 最后,生成相关问题时要基于回答内容,比如单例模式的原因、如何修改作用域、自动配置原理等。确保问题覆盖用户可能感兴趣的后续点。 现在整理结构:分点回答,包括设计模式、Bean作用域、日志框架、配置惯例、事件驱动模型。每个部分引用对应的引用来源,末尾添加相关问题。</think>### Spring框架默认模式与配置解析 #### 1. **默认设计模式** - **单例模式**:Spring管理的Bean默认作用域为单例(`singleton`),容器中仅创建一个实例供所有请求复用。此设计通过减少对象创建开销提升性能,特别适合无状态Bean场景[^4]。 - **工厂模式**:通过`BeanFactory`和`ApplicationContext`实现对象的创建与管理,解耦对象实例化过程。 - **观察者模式**:基于`ApplicationEvent`和`ApplicationListener`实现事件发布-订阅机制,例如`ContextRefreshedEvent`(容器刷新完成事件)[^3]。 #### 2. **Bean作用域默认配置** - 默认作用域为单例,可通过`@Scope("prototype")`修改为原型模式(每次请求创建新实例)。 - 示例配置: ```xml <bean id="exampleBean" class="com.example.ExampleBean" scope="prototype"/> ``` #### 3. **默认日志框架** - Spring Boot默认集成`Logback`日志框架,通过`spring-boot-starter-logging`自动引入。开发时无需额外配置即可使用日志功能[^1]。 #### 4. **配置惯例** - **依赖注入**:默认按类型自动装配(`@Autowired`),若有多个同类型Bean需配合`@Qualifier`指定名称。 - **组件扫描**:Spring Boot默认扫描主类所在包及其子包下的`@Component`、`@Service`等注解类。 - **数据源配置**:Spring Boot自动配置内存数据库(如H2)或根据`application.properties`中的`spring.datasource`配置连接外部数据库。 #### 5. **事件驱动模型** - Spring内置四种容器事件,均继承自`ApplicationContextEvent`: - `ContextStartedEvent`:容器启动后触发 - `ContextStoppedEvent`:容器停止后触发 - `ContextRefreshedEvent`:容器初始化或刷新后触发 - `ContextClosedEvent`:容器关闭后触发[^3] --- ###
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值