常见的设置模式


文章目录

  • 常见的设置模式

  • 1. 为什么需要学习设计模式
  • 设计模式的广泛使用起始于1995年,GOF(四人帮)出版的《设计模式:可复用面向对象软件基础》
  • 2. 常见的设计模式
  • 2.1 [单例模式]()
  • 2.1.2 使用场景
  • 2.1.3 优缺点
  • 2.1.4 示例
  • 测试结果:如图
  • 测试结果:如图
  • 2. 工厂模式
  • 概念:用于产生对象的方法或者式类,称之为工厂, 上面所讲到的单例模式也可以看作为一个特殊的工厂
  • 使用场景
  • 工厂方法
  • 类图:仅供参考
  • 2.1抽象工厂
  • 用于生成指定产品族,一个产品族中包括多种产品。例如:
  • 类图:仅供参考


1. 为什么需要学习设计模式

设计模式(Design pattern)代表了最佳的实践是很多优秀的软件开发人员的经验总结,是解决特定问题的解决方案。它并不是语法规定,也不拘泥于特定语言。 恰当的使用设计模式可以代码的可复用性,可维护性,可扩展性,健壮性及安全性,这些都是系统非常重要的非功能性需求

设计模式的广泛使用起始于1995年,GOF(四人帮)出版的《设计模式:可复用面向对象软件基础》

示例代码:

https://gitee.com/lisenaq/patterndemo.git
2. 常见的设计模式
2.1 单例模式

概念:简单来说就是 一个类就一个对象

2.1.2 使用场景

比如:系统配置文件的管理,这些配置文件只要使用一个单例对象进行读写即可,系统总其他地方需要使用配置信息时,只要使用该单例对象进行获取就可以了,这样便于统一管理配置信息。

2.1.3 优缺点

优点:

  • 在内存中只有一个对象,节省内存空间;
  • 避免频繁的创建销毁对象,可以提高性能;
  • 避免对共享资源的多重占用,简化访问;
  • 为整个系统提供一个全局访问点。

缺点:

  • 不适用于变化频繁的对象;
  • 滥用单例将带来一些负面问题,如为了节省资源将数据库连接池对象设计为的单例类,可能会导致共享连接池对象的程序过多而出现连接池溢出;
2.1.4 示例
  • 单列(饥饿模式)
package com.zking.com;

public class Let {
	// 1. 需要有一个私有的构造函数,防止该类通过new的方式创建实例
	private Let() {
	}

	// 2. 饥饿模式,首先生成一个实例
	private static final Let instance = new Let();

	// 3. 静态方法,用于获取已经生成的实例
	public static Let getInstance() {
		return instance;
	}

	public String hello(String name) {
		return "hello " + name;
	}

/**
 * 
 * 测试单列线程是否正常
 * 
 */
public static void main(String[] args) {
       for (int i = 0; i < 100; i++) {//将线程循环一百次
		new Thread(()->{
			System.out.println(Let.getInstance().hashCode());
		}).start();
	}
	
	}
}
测试结果:如图

Ymodem应答_设计模式

⭐可以看到线程的输出都一样 (说明线程正常)而且这种直线方式简单,且是线程安全的。

  • 单列(懒汉模式)双重检查
package com.zking.com;

public class SingletonDemo03 {
	/**
	 * 单例模式: 懒汉式,双重检查单例
	 */
       //私有化构造函数  目的  防止类 用new 实列 调用  
	    private SingletonDemo03(){}

	    private static SingletonDemo03 singletonDemo03 = null;

	    public static  SingletonDemo03 getInstance(){
	        //减小同步块,并使用双重检查来保证线程安装,可以吗?可以
	        if(singletonDemo03 == null) {
	            synchronized (SingletonDemo03.class) {
	                if(singletonDemo03 == null) {
	                    singletonDemo03 = new SingletonDemo03();
	                }
	            }
	        }
	         return singletonDemo03;
	   }

	    public String hello(String name) {
	        return "hello " + name;
	    }

/**
 * 
 * 测试单列线程是否正常
 * 
 */
public static void main(String[] args) {
       for (int i = 0; i < 100; i++) {//将线程循环一百次
		new Thread(()->{
			System.out.println(Let.getInstance().hashCode());
		}).start();
	    }
	}
}

⭐这种写法 带有双重检查 且线程安全

测试结果:如图

Ymodem应答_单例模式_02

⭐注意:本(懒汉模式)方法很多这是其中一种 我个人觉得好用的(其他的写法可以自行了解)🙏


2. 工厂模式
概念:用于产生对象的方法或者式类,称之为工厂, 上面所讲到的单例模式也可以看作为一个特殊的工厂
使用场景

为什么需要工作模式,原来使用new的方式感觉也很简单,且好懂?

使用工厂的原因是我们可以通过工厂模式,来集中控制对象的创建过程,这样可以给设计带来更多的灵活性。

比如:spring的IOC容器就是工厂模式的经典实现。

工厂方法

用于生产指定系列的对象,已鸭子为例,鸭子有真的鸭子,橡皮鸭,电子玩具鸭等。如何能方便的创建出各种鸭子,并将创建过程控制起来,以便于以后的维护和扩展?

类图:仅供参考

Ymodem应答_工厂模式_03

2.1抽象工厂
用于生成指定产品族,一个产品族中包括多种产品。例如:

我们都比较熟悉的电脑制造相关行业,有HP,罗技,联想,戴尔,近几年华为,小米也进来了,每个生产商生产的电脑又包括鼠标,键盘,屏幕等等配件。此时我们需要使用工厂模式来进行管理不同的产品族,这时使用简单工厂(也有叫作工厂方法的)已经无法满足要求,此时可以使用抽象工厂。

类图:仅供参考

Ymodem应答_单例模式_04

⭐⭐⭐⭐⭐本期类容就到此结束⭐⭐⭐⭐⭐