什么是单例模式?
单例模式确保某个类只有一个实例,而且自行实例化并向整个系统提供这个实例。
1、一个单例模式的要求有三点:
1)私有的变量
2)私有的构造函数
3)公有的方法,返回一个实例对象
2、实现单例的方式(举例)
1)饿汉模式:饿汉式单例在类加载初始化时就创建好一个静态的对象供外部使用,除非系统重启,这个对象不会改变,所以本身就是线程安全的。
/**
* 饿汉模式
*/
//私有的变量
private static Singleton singleton=new Singleton();
//私有的构造函数
private Singleton() {}
//公有的方法,返回一个实例对象
public static Singleton getInstance() {
System.out.println("111");
return singleton;
}
2)懒汉模式(延迟式)
/**
* 懒汉模式
*/
//私有的变量
private static Singleton singleton1=null;
//私有的构造函数
private Singleton() {}
//公有的方法,返回一个实例对象
public static Singleton getInstance1() {
if(null==singleton1) {
singleton1=new Singleton();
}
return singleton1;
}
但在多线程环境下会产生多个single对象,解决办法:使用synchronized同步锁(synchronized方法和代码块)。
3)应用
网站计数器。当有用户访问时计数器+1,并能获取当前的访问个数。
该需求我们需要用单例模式,保证所有用户操作的数据都是同一个数据;
a.如果非单例模式结果是我们想要的吗??
b.添加上单例的结果:
4)单例的应用
spring中管理的bean对象默认就是单例的。
1、什么是工厂模式
工厂模式是我们最常用的实例化对象模式了,是用工厂方法代替new操作的一种模式。
为什么要用工厂模式?
以汽车为例,在现实社会中会有一个汽车工厂,通过这个工厂我们可以生产中各种类型的车,小轿车,越野车,吉普车等等。对应到我们的工厂模式,汽车工厂就是我们的工厂,汽车就是我们要实例化的对象。
2、工厂模式有简单工厂模式,工厂方法模式,抽象工厂模式
我们用UML的类图来讲解工厂模式的三种实现方法
UML是统一建模语言,UML主要使用图形符号来表示软件项目的设计,使用UML可以帮助项目团队沟通、探索潜在的设计和验证软件的架构设计。
参考地址:
https://www.visual-paradigm.com/cn/guide/uml-unified-modeling-language/what-is-uml/
UML的类图描述了系统中对象的类型以及它们之间存在的各种静态关系。
免费在线制图的地址参考:https://www.processon.com/,可以画这种UML图
UML类图的三种关系:
1)
2)关联关系
A关联B,在A类中有一个B类的对象属性;Zoo关联Monkey,因为在Zoo动物园中有Monkey的实例变量;
3)依赖关系
A依赖到B,在A的某个方法中使用到了B。人People依赖食物Food
3、简单工厂模式
1).既然要造车我们给他一个接口ICar,有一个make方法
2).Jeep,RaceCar,SportsCar实现ICar接口,分别生产吉普车,赛车,跑车
3).创建一个简单工厂类SimpleCarFatory,有一个方法makeCar,可以根据字符串“jeep”“raceCar”,“sportsCar”生产出不同的车;
4).每个用户可以从工厂中得到自己的产品;
5).优缺点:
优点:简单工厂模式能够根据外界给定的信息,决定究竟应该创建哪个具体类的对象。
明确区分了各自的职责和权力,有利于整个软件体系结构的优化。
缺点:
1 扩展性差(我想增加一种车,除了新增一个车的产品类,还需要修改工厂类方法)
2 生产不同产品时,需要额外的字符串参数的支持。
4、工厂方法模式
提供一个工厂接口,让其实现类(工厂实现类)决定实例化哪一个类(产品类),并且由该实现类创建对应类的实例。
好处:增加一个车,只需要增加车的工厂类和产品类两个类,不需要修改其它的工厂类。
缺点:增加车类,会修改客户端代码,工厂方法只是把简单工厂的内部逻辑判断移到了客户端进行。
5、抽象工厂模式
抽象工厂模式和工厂方法模式很相似,但是一个具体工厂可以制造几个产品,是对一组具有相同主题的工厂进行封装。
参考地址:
https://www.cnblogs.com/zailushang1996/p/8601808.html