目录
1.定义:通过复制现有实例来创建新的实例,无需知道相应类的信息。
1.定义:保证一个类仅有一个实例,并提供一个访问它的全局访问点。 (如spring里的bean对象)
1.定义:定义一个用于创建对象的接口,让子类决定将哪一个类实例化。工厂方法模式让一个类的实例化延迟到其子类。
1.什么是设计模式?
每个模式都描述了一个在我们的环境中不断出现的问题,然后描述了该问题的解决方案的核心,通过这种方式,我们可以无数次地重用那些已有的成功的解决方案,无须再重复相同的工作
设计模式是在特定环境下人们解决某类重复出现问题的一套成功或有效的解决方案
2.创建型模式
共五种:工厂方法模式、抽象工厂模式、单例模式、建造者模式、原型模式。
3 原型模式
1.定义:通过复制现有实例来创建新的实例,无需知道相应类的信息。
public class Demo1 {
public static void main(String[] args) {
HashMap hm1 = new HashMap();
hm1.put("name","zs");
hm1.put("sex","女");
HashMap hm2 = hm1;
hm1.put("age","18");
hm2.put("like","男");
System.out.println(hm1);
System.out.println(hm2);
}
}
操作的同一个Map
输出结果不符合预期
public static void main(String[] args) {
HashMap hm1 = new HashMap();
hm1.put("name","zs");
hm1.put("sex","女");
HashMap hm2 = (HashMap) hm1.clone();
hm1.put("age","18");
hm2.put("like","男");
System.out.println(hm1);
System.out.println(hm2);
}
使用clone()复制,得到期望的结果
2.浅克隆和深克隆
主要区别在于是否支持引用类型的成员变量的复制
1. 浅克隆
在浅克隆中,当对象被复制时只复制它本身和其中包含的值类型的成员变量,而引用类型的成员对象并没有复制
2.深克隆
在深克隆中,无论原型对象的成员变量是值类型还是引用类型,都将复制一份给克隆对象,深克隆将原型对象的所有引用对象也复制一份给克隆对象。
注意事项:与通过对一个类进行实例化来构造新对象不同的是,原型模式是通过拷贝一个现有对象生成新对象的。浅拷贝实现 Cloneable,重写,深拷贝是通过实现 Serializable 读取二进制流。
4.单例模式
1.定义:保证一个类仅有一个实例,并提供一个访问它的全局访问点。 (如spring里的bean对象)
单例:Singleton
单例模式特点
1、单例类只能有一个实例。
2、单例类必须自己创建自己的唯一实例。
3、单例类必须给所有其他对象提供这一实例。
优点:
- 1、在内存里只有一个实例,减少了内存的开销,尤其是频繁的创建和销毁实例
- 2、避免对资源的多重占用。
缺点:
变量污染
- 分类
- 饿汉式(静态常量)
- 饿汉式(静态代码块)
- 懒汉式(线程不安全)
- 懒汉式(线程安全,同步代码块)
- 懒汉式(线程安全,同步方法)
- 双重检查
- 静态内部类
- 枚举
单例中两种饿汉式可用,但是存在性能问题
单例中三种懒汉式不推荐,存在线程安全问题,同步方法的方式解决了线程的问题,但是性能极差
最后三种单例模式值得推荐
5.工厂模式
1.定义:定义一个用于创建对象的接口,让子类决定将哪一个类实例化。工厂方法模式让一个类的实例化延迟到其子类。
优点
1.系统带来更大的可扩展性和尽量少的修改量 , 就是具体事情做得越多,越容易犯错误.这每个做过具体工作的人都深有体会,相反,官做得越高,说出的话越抽象越笼统,犯错误可能性就越少.
缺点:每次增加一个产品时,都需要增加一个具体类和对象实现工厂,使得系统中类的个数成倍增加,在一定程度上增加了系统的复杂度,同时也增加了系统具体类的依赖。
- 注意事项及细节
将对象的初始化交给工厂类
构造函数初始化会影响到子类,耦合度过高
在于解耦自身对象实例化和对象初始化动作,还有一个因素在于构造函数的初始化会影响到子类