package zx.lo.sjms;
public class Singleton1 {
//懒汉式单例设计模式
public static void main(String[] args) {
Singleton s1 = Singleton.getSingleton();
Singleton s2 = Singleton.getSingleton();
System.out.println(s1==s2);
}
}
class Singleton{
private static Singleton singleton;
//保证这个类在jvm中只能有一个实例
private Singleton() {
//私有化构造器,反射也不可以初始化
}
//当两个线程同时执行这一段代码,会new两个对象所以线程不安全
static public Singleton getSingleton() {
if(singleton == null) {
synchronized (Singleton.class) {
singleton = new Singleton();
}
}
return singleton;
}
}
懒汉式线程不安全,所以在判断是否已经new对象后,对singleton为空时,新建对象的代码上锁,选择同步代码块,不是同步方法,因为有线程安全问题的只有singleton = new Singleton();
单例设计类中,私有化构造器,为了将单例模式不能被随意new,而且不会被反射初始化。
饿汉式单例模式
package zx.lo.sjms;
public class Singleton2 {
public static void main(String[] args) {
SingletonE s1 = SingletonE.getSingletonE();
SingletonE s2 = SingletonE.getSingletonE();
System.out.println(s1==s2);
}
}
//饿汉式,当class文件加载时,就会被初始化,天生安全
class SingletonE{
private static final SingletonE singletone = new SingletonE();
private SingletonE() {
}
static public SingletonE getSingletonE() {
return singletone;
}
}
懒汉式当需要的时候才初始化,而饿汉式加载class文件时,就已经初始化。 懒汉式节约内存。
懒汉式有线程安全问题,故需要加上同步代码块,反而在效率上不如饿汉式。
工厂模式
简单的工厂模式
设计car接口,设计run方法。
audi,benci继承car接口。
单一工厂,代工Audi以及benci车辆生产。
public interface Car {
public void run();
}
public class Audi implements Car{
@Override
public void run() {
System.out.println("Audi------");
}
}
public class Benci implements Car {
@Override
public void run() {
System.out.println("benci----------");
}
}
public class CarFactory {
static public Car createCar(String carType) {
Car car = null;
switch (carType) {
case "audi":
car = new Audi();
break;
case "benci":
car = new Benci();
break;
default:
break;
}
return car;
}
}
public class Main {
public static void main(String[] args) {
Car car1 = CarFactory.createCar("audi");
car1.run();
}
}
简单的工厂模式2
audi和benci各一个工厂
public class BenciFactory {
static public Car createCar() {
return new Benci();
}
}
public class AudiFactory {
static public Car createCar() {
return new Audi();
}
}
public class Main {
public static void main(String[] args) {
AudiFactory.createCar();
BenciFactory.createCar();
}
}