单例模式:一种对象创建模式,用于产生一个对象的具体实例,确保系统中一个类只有一个实例
好处:a,对于频繁使用对象,可以省略多次创建对象的时间。对于重量级对象而言,可以节省性能开销
b,new操作次数减少
实现思路:1.将该类的构造方法使用private修饰,将实例化代码留在类内部
2.暴露一个公开方法提供给使用者获取该实例
饿汉式:
优点:写法简单,由于实例化代码是static修饰的,该类在被虚拟机加载的时候就会完成实例化,避免线程同步问题,而且后续在使用时无需等待实例化,效率高
缺点:由于类加载时候就会初始化,此时需要初始化大量数据,将会增加App启动速度,同时,后续如果长时间没有使用该变量,将会造成系统内存浪费
public class Only {
private static Only song = new Only();
private Only(){ }
public static Only getInstance(){
return song;
}
}
懒汉式:
优点:将类的初始化放到了开发者调用时,起到了延迟加载的效果,某些情况也能避免内存浪费,同时通过synchronized关键字实现线程安全,这样使得该对象只实例化一次
缺点:每个线程在访问该方法时都要去获取锁,降低访问效率
private static Only song;
private Only(){}
public static synchronized Only getInstance(){
if (song == null) {
song = new Only();
}
return song;
}
构建者模式(建造者模式):将一个复杂对象的创建和表示进行分离,使得同样的构建过程可以创建不同的表示
优点:写法简洁,代码优美,开发者无需了解对象内部组成的细节,只需关心自己需要什么对象
工厂模式:工厂模式专门负责将大量有共同接口的类实例化,可以动态决定将哪一个类实例化,而不必事先知道每次要实例化哪个类
简单工厂模式,即定义一个类来负责其他类的实例化,被创建者的实例通常有共同的父类或者实现了同一个接口
public interface Animal {
}
public class Cat implements Animal {
private String fish;
public Cat(String fish) {
this.fish = fish;
}
}
public class Dog implements Animal {
private String bone;
public Dog(String bone) {
this.bone = bone;
}
}
public class AnimalFactory {
public static Animal CreateCat(String fish){
return new Cat(fish);
}
public static Animal CreateDog(String bone){
return new Dog(bone);
}
}
工厂方法模式:用于创建对象的接口,让子类决定实例化哪一个类,工厂方法使一个类的实例化延迟到其子类;在该模式中,核心工厂类不再负责所有产品创建,只是定义创建对象的方法,将具体任务交给子类去做
public interface CatFactory {
Cat createFactory(String fish);
}
public class ChinaCatFactory implements CatFactory {
@Override
public Cat createFactory(String fish) {
return new Cat(fish);
}
}
public class AmericaCatFactory implements CatFactory {
@Override
public Cat createFactory(String fish) {
return new Cat(fish);
}
}
抽象工厂模式:提供一个创建一系列或相互依赖的对象的接口,而无需指定它们的具体类
public interface CatFactory {
Cat createOrangeCat(String fish);
Cat createAmericaCat(String fish);
Cat createPuppetCat(String fish);
}
//中国猫工厂只创建橘猫
public class ChinaCatFactory implements CatFactory {
@Override
public Cat createOrangeCat(String fish) {
return new Cat(fish);
}
@Override
public Cat createAmericaCat(String fish) {
return null;
}
@Override
public Cat createPuppetCat(String fish) {
return null;
}
}
//美国猫工厂只创建布偶猫和美短猫
public class AmericaCatFactory implements CatFactory {
@Override
public Cat createOrangeCat(String fish) {
return null;
}
@Override
public Cat createAmericaCat(String fish) {
return new Cat(fish);
}
@Override
public Cat createPuppetCat(String fish) {
return new Cat(fish);
}
}
观察者模式:实现方式是:先定义观察者和目标的基类,目标需要提供维护观察者的方法(比如注册和解除注册),观察者需要提供更新接口;接下来具体的观察者和具体的目标就继承基类,具体观察者将自己注册到具体目标中,这样当具体目标类发生变化时,就可以调用已注册的观察者的更新方法
观察者模式和发布定阅模式的区别:
发布订阅模式统一由调度中心调度,而观察者模式由具体目标进行调度
发布订阅模式中订阅者和发布者不存在耦合,而观察者模式中观察者和目标存在耦合关系