java单例模型和工厂模式,java单例模式和工厂模式

单例模式

饿汉式

//饿汉式

public class Hungry {

//浪费空间

private byte[] data1=new byte[1024*1024];

private byte[] data2=new byte[1024*1024];

private byte[] data3=new byte[1024*1024];

private byte[] data4=new byte[1024*1024];

private Hungry(){

}

private final static Hungry HUNGRY=new Hungry();

public static Hungry getIndtrance(){

return HUNGRY;

}

}

复制代码

构造函数私有化

先创建一个对象

懒汉式

package abc;

//懒汉式

public class LazyMan {

private LazyMan(){

System.out.println(Thread.currentThread().getName()+"ok");

}

private volatile static LazyMan LazyMan;

//双重检测模式懒汉式单例 DCL懒汉式

public static LazyMan getInstance(){

if(LazyMan==null){

synchronized(LazyMan.class){

if(LazyMan==null){

LazyMan=new LazyMan();//不是一个原子性操作所以加上volatile

/**

* 1.分配内存空间

* 2.执行构造方法,初始化对象

* 3.把这个对象指向这个空间

*/

}

}

}

return LazyMan;

}

}

复制代码

构造函数私有化

加synchronized防止多个线程同时创建对象

volatile防止指令重排,保持原子性,防止另一个线程指向空此时LazyMan还没有完成构造

静态内部类

package abc;

public class Hold {

private Hold(){}

public static Hold getInstace(){

return InnerClass.HOLD;

}

public static class InnerClass{

private static final Hold HOLD=new Hold();

}

}

复制代码

工厂模式

静态工厂模式

1.简单工厂模式

public class CarFactory {

public static Car getCar(String car){

if(car.equals("五菱")){

return new Wuling();

}else if(car.equals("特斯拉")){

return new Tesla();

}else{

return null;

}

}

}

复制代码

2.工厂方法模式

public interface CarFactory {

Car getCar();

}

复制代码

public class TeslaFactory implements CarFactory{

@Override

public Car getCar() {

// TODO Auto-generated method stub

return new Tesla();

}

}

复制代码

Car car=new TeslaFactory.getCar();

复制代码

99ad409d12975c2dff75a0e3e09fe1da.png

抽象工厂

是生产工厂的超级工厂(接口)

0f82a024b1e3c3b34c3c92ff8af92974.png

3068e46cba9ee752786d8d2e0e472a65.png

00f66cc57929bac3d1e7476bd1360947.png

299a288621a3af5cb863a5c31a319a92.png

0b3fa48dcc25a5c4e3d166a040231af8.png

Lambda 表达式

@Test public void test1() {

Runnable runnable = new Runnable() {

@Override

public void run() {

System.out.println("线程启动了");

}

};

runnable.run();

}

/**

* 语法格式一:无参数,无返回值

* () -> System.out.println("Hello Lambda!");

*/

@Test

public void test2() {

//“->”左边只有一个小括号,表示无参数,右边是Lambda体(就相当于实现了匿名内部类里面的方法了,(即就是一个可用的接口实现类了。))

Runnable runnable = ()->System.out.println("线程启动了");

runnable.run();

}

复制代码

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值