懒汉:(线程安全)
public class Singleton{
private volatile static Singleton singleton;
private Singleton(){};
public static synchronized Singleton getSingleton() {
if(singleton == null) {
singleton = new Singleton();
}
return singleton;
}
}
静态内部类
public class Singleton{
private Singleton() {};
private static class InSingleton{
private static Singleton singleton = new Singleton();
}
public static Singleton getSingleton() {
return InSingleton.singleton;
}
}
枚举类:
private enum Singleton{
INSTANCE;
}
双重校验:
public class Singleton{
private volatile static Singleton singleton;
private Singleton(){};
public static Singleton getSingleton() {
if(singleton == null) {
synchronized(Singleton.class) {
if(singleton == null) {
singleton = new Singleton();
}
}
}
return singleton;
}
}
二、工厂模式
简单工厂模式、工厂方法模式、抽象工厂模式。
1、简单工厂模式
建立一个工厂类,通过传递不同的数据来通过工厂类创建不同的实现类返回给调用者调用这个实例的方法。
抽象接口车间 :
public interface WorkShop{
public abstract void method();
}
实现方法:
public class WorkShop1 implements WorkShop{
@Override
public void method(){
System.out.println("第一车间生产");
} }
public class WorkShop2 implements WorkShop{
@Override
public void method(){
System.out.println("第二车间生产");
} }
public class Factory{
public WorkShop getWorkShop(String str){
if( "第一车间".equals( str ) ){
return new WorkShop1();
} else if( "第二车间".equals( str )){
return new WorkShop2();
} } }
测试类:
public class Test{
public void test(){
Factory factory = new Factory();
WorkShop workShop = factory.getWorkShop("第一车间");
workShop.method();
WorkShop workShop = factory.getWorkShop("第二车间");
workShop.method();
}
}
2、工厂方法模式 -----新增加功能需要重写工厂类,不符合开闭原则
重写工厂类
public class Factory{
public WorkShop getWorkShop1(){
return new WorkShop1();
}
public WorkShop2 getWorkShop2(){
return new WorkShop2();
}
}
测试类:
public class Test{
public void test(){
Factory factory = new Factory();
WorkShop workShop1 = factory.getWorkShop1();
WorkShop workShop2 = factory.getWorkShop2();
}}
3、抽象工厂方法----抽象工厂方法新增加工厂类和车间类都不需要修改原来的类,符合开闭原则,新增功能只需要添加实现抽象工厂的新工厂类和实现抽象车间的新车间类。
抽象车间
public interface WorkShop{
void method();
}
车间实现类
public class WorkShop1 implements WorkShop {
@Override
public void method(){
System.out.println( "第一车间生产" );
}}
public class WorkShop2 implements WorkShop {
@Override
public void method(){
System.out.println( "第一车间生产" );
}}
工厂抽象类
public interface Factory{
public WorkShop getWorkShop();
}
工厂实现类:
public class Factory1 implements Factory{
@Override
public WorkShop1 getWorkShop(){
return new WorkShop1();
}}
public class Factory2 implements Factory{
@Override
public WorkShop2 getWorkShop(){
return new WorkShop2();
}}
测试类:
public class Test{
public void test(){
Factory factory1 = new Factory1();
WorkShop workShop1 = factory1.getWorkShop();
workShop1.method();
Factory factory2 = new Factory2();
WorkShop workShop2 = factory2.getWorkShop();
workShop2.method();
}}