1.单例模式
分为懒汉和饿汉;
懒汉:
public class Singleton
{
// 私有的、静态的成员保存唯一的实例
private static Singleton singleton;
// 私有构造器,避免被创建实例
private Singleton(){}
// 提供一个公共的、静态的方法,获取唯一的实例
public static Singleton getInstance()
{
// 很多示例代码都是在方法上加同步,但是基于“最小范围原则”,应该要用同步代码块
// 这样可以尽可能提升程序的并发性能
synchronized( Singleton.class )
{
// 判断singleton是否为null,如果是null则新建一个
if( singleton== null )
{
singleton = new Singleton();
}
}
return singleton;
}
}
饿汉:
public class Singleton
{
// 私有的、静态的成员保存唯一的实例
// 在类被第一次使用的时候,就已经完成了加载。类的加载过程,系统保证线程安全。
private static Singleton singleton = new Singleton();
// 私有构造器,避免被别人创建实例
private Singleton(){}
// 提供一个公共的、静态的方法,获取唯一的实例
public static Singleton getInstance()
{
return singleton ;
}
}
懒汉:在初始化类的时候,不创建唯一的实例,而是等到真正需要用到的时候才创建。必须加上同步,否则有可能依然创建多个实例。
饿汉:在初始化的时候,就创建了唯一的实例,不管是否需要用到。不需要自己加同步,一定产生唯一的实例。
在访问量较小时,采用懒汉实现,频繁创建对象的时候,采用饿汉模式;
开闭原则:
在面向对象编程领域中,开闭原则规定“软件中的对象(类,模块,函数等等)应该对于扩展是开放的,但是对于修改是封闭的”,这意味着一个实体是允许在不改变它的源代码的前提下变更它的行为
工厂模式
说起工厂模式,就要说new和newInstance的区别
反射能降低耦合度,要实例化的类名放到配置文件里,需要的时候创建,newInstance使用类加载机制,从可伸缩,可拓展,可重用等软件思想解释;反射就是在运行时才知道要操作的类是什么,并且可以在运行时获取类的完整构造,并调用对应的方法;
在使用反射的时候,必须确保这个类已经加载并已经连接了。使用new的时候,这个类可以没有被加载,也可以已经被加载。
new关键字可以调用任何public构造方法,而反射只能调用无参构造方法。
new关键字是强类型的,效率相对较高。 反射是弱类型的,效率低。
反射提供了一种更加灵活的方式创建对象,得到对象的信息。如Spring 中AOP等的使用,动态代理的使用,都是基于反射的。
好处:
1、将创建实例的工作与使用实例的工作分开
2、把初始化实例时的工作放到工厂里进行,使代码更容易维护。
3、使得修改代码时不会引起太大的变动,良好的扩展性。
适配器模式
具体操作可看 [https://blog.csdn.net/wwwdc1012/article/details/82780560],写的挺详细的