java设计模式分为三种类型,共23种。
单例模式、抽象工厂模式、原型模式、建造者模式、工厂模式
适配器模式、桥接模式、装饰模式、组合模式、外观模式、代理模式
模板方法模式、命令模式、访问者模式、迭代器模式、观察者模式、中介者模式、备忘录模式、解释器模式、状态模式、策略模式、责任链模式
简单工厂模式在JDK-Calender 中有应用,具体分为简单工厂模式,工厂方法模式,抽象工厂模式。
简单工厂模式是属于创建型模式,是工厂模式的一种。简单工厂模式是由一个工厂对象决定创建出哪一种产品类的实例。
简单工厂模式定义了一个创建对象的类,由这个类来封装实例化对象的行为。
在软件开发中,当我们用到大量的创建某种类或者某批对象时,就需要用到工厂模式。
简单工厂就是在开发过程中,如果根据需求要创建多个对象类时,为了不违背开闭原则(即对扩展开放,对修改关闭),而新建一个工厂类,用来与修改(使用方)交互,从而创建所需要的对象。这样便可以保证,若要添加新的类对象,只在工厂类中修改代码即可。
抽象工厂模式:定义了一个interface用于创建相关或有依赖关系的对象簇,而无需指明具体的类。
抽象工厂模式可以将简单工厂模式和工厂方法模式进行整合。
从设计层面看,抽象工厂模式就是对简单工厂模式的改进(或称为进一步的抽象)
将工厂抽象成两层,AbsFactory和具体实现的工厂子类。我们可以根据创建对象类型使用对应的工厂子类。这个将单个的简单工厂类变成了工厂簇。
原型模式是指:用原型实例指定创建对象的种类,并且通过拷贝这些原型,创建新的对象。
原型模式是一种创建型设计模式,允许一个对象再创建另外一个可控制的对象,无需知道创建的细节。
工作原理是:通过将一个原型对象传给那个要发动创建的对象,这个要发动创建的对象通过请求原型对象,拷贝自己来实施创建,即对象clone().
Spring中原型bean的创建,就是原型模式的应用。
对于数据类型是基本类型的成员变量,浅拷贝会直接进行数据川剧,也就是将该属性值复制一份给新的对象。
对于数据类型是引用数据类型的成员变量,比如说变量是某个数组,某个类的对象等。浅拷贝会进行引用传递,就是只将改成员变量的印用值(内存地址)复制一份给新的对象。实际上两个对象的都指向同一个实例。在这种情况下,在一个对象中修改成员变量,会影响到另一个对象的变量值。
复制对象的所有基本数据类型的成员变量值
为所有印用数据类型的成员变量申请储存空间并复制每个引用数据类型成员变量所引用的对象,直到该对象可选的所有对象。
深拷贝实现方式:重写clone方法、通过对象序列化实现深拷贝
建造者模式又叫生成器模式,是一种对象构建模式。可以将复杂对象的建造过程抽象出来,使这个抽象过程的不同实现方法可以构造出不同表现的对象。
建造者模式是一步一步创建一个复杂的对象,它允许用户只通过指定复杂对象的类型和内容就可以构建它们。用户不需要知道内部的具体构造细节。
product(产品角色):一个具体的产品对象
builder(抽象建造者):创建一个Product对象的各个部分指定的接口抽象类。
ContractBuilder(具体建造者):实现接口,构造和配备各个部件》
Director(指挥者):构建一个使用Builder接口的对象,它主要用于创建一个复杂的对象。主要有两个作用,一个是隔离了客户与对象的生成过程,另一个是负责控制产品和对象的生产过程。
对象适配器模式是适配器模式常用的一种。根据合成复用原则,在系统中尽量使用关联关系代替继承关系。
桥接模式是一种结构型设计模式,将实现与抽象放在两个不同的类层次中,使两个层次可以独立改变。
桥接模式基于类的最小设计原则,通过使用封装、聚合以及继承等行为,让不同的类承担不同的职责。
一:类只能有一个实例 --构造器私有化。
二:必须自行创建实例 --含有一个改类的静态变量来保存这个唯一的实例,
三:必须自行向整个系统提供这个实例 ---对外提供获取该实例对象的方式:直接暴露、用静态变量的get方法获取。
饿汉式:直接创建对象(不存在线程安全问题)
1、直接实例化饿汉式(简洁直观)
2、枚举式(最简洁)
3、静态代码化饿汉式(适合复杂实例化)
懒汉式:延迟创建对象(静态变量私有)
1、线程不安全(适用于单线程)
2、线程安全(适用于多线程,加上synchronized)
3、静态内部类形式(适用于多线程)。 在内部类被加载和初始化时才创建intance对象。 此种方式因为是在内部类加载和初始化时创建的,因此是线程安全的。
直接实例化:
public class Singleton{
//创建静态变量保存实例
public static final Singleton INSTANCE
=new Singleton();
//私有化构造器
private Singleton(){
}
}
枚举式:(最简洁,且重写了toString方法,打印的是实例化名称)
public enum singleton{
INSTANCE
}
静态代码块(复杂实例化,可用于反射)
public class singleton{
public static final singleton INSTANCE;
static {
INSTANCE=new singleton();
}
private class singleton(){
}
}
私有静态变量,延迟创建实例化对象
非线程安全
public class Singleton{
private staitc singleton INSTANCE;
private Singleton(){
}
//公有静态方法获取实例对象
public staitc Singleton getIntacne(){
if(INSTANCE==null){
INSTANCE=new Singleton();
}else{
return INSTANCE;
}
}
}
线程安全(synchronized),双重检查
public class Singleton{
private static Single INSTANCE;
private Single(){
}
public static Singleton getInstance(){
if(INSTANCE==null){
synchronized(Singleton.class){
if(INSTANCE==null){
INSTANCE=new Singleton();
}
}
}
}
}
静态内部类生成实例对象
public class singleton{
private Singleton(){
}
private static class Inner{
private static final Singleton INSTANCE=new Single();
}
public static Singleton getInstance(){
return Inner.INSTANCE;
}
}