设计模式:单例模式(懒汉式,饿汉式),工厂模式

什么是设计模式• 设计模式是在大量的实践中总结和理论化之后优选的代码结构、编程风格、以及解决问题的思考方式。设计模式就像是经典的棋谱,不同的棋局,我们用不同的棋谱,免去我们自己再思考和摸索。
所谓类的单例设计模式,就是采取一定的方法保证在整个的软件系统中,对某个类只能存在一个对象实例,并且该类只提供一个取得其对象实例的方法。• 实现单例模式需要满足三个条件:•
1、单例类只能有一个实例。•
2、单例类必须自己创建自己的唯一实例。•
3、单例类必须给所有其他对象提供这一实例
//第一步 构造方法私有化//第二部 声明一个当前类对象,你可以直接实例化(饿汉式)也可以在方法里实例化(懒汉式)//第三步 声明一个静态方法,返回类型就是当前类类型把当前类对象返回给这个方法单例(Singleton)设计模式-饿汉式// 饿汉式单例
public class Singleton1 {

// 指向自己实例的私有静态引用,主动创建
private static Singleton1 singleton1 = new Singleton1();

// 私有的构造方法
private Singleton1(){}

// 以自己实例为返回值的静态的公有方法,静态工厂方法
public static Singleton1 getSingleton1(){
    return singleton1;
}

}
单例(Singleton)设计模式-懒汉式
public class Demo1 {
//当前对象 只能本类访问 static
private static Demo1 a1=null;
//解决第一个问题 外界访问的不能让他new对象 构造方法私有化
private Demo1(){ }
//第二个问题 外界能访问当前类对象 每次访问都是同一个对象 书写一个方法方法的返回类型就是当前类类型
//这个方法作用就是供外界访问此方法 得到当前类对象 public static Demo1 getDemo1(){
if (a1null) {
System.out.println(“对象实例化了”);
a1=new Demo1();
}
return a1;
}
//类中是要给方法一个当前对象 没有当前对象该怎么办? 没有我就声明
public static void main(String[] args) {
Demo1 demo1=new Demo1();
Demo1 demo12=new Demo1(); System.out.println(demo1
demo12);
//每次new都是新对象 所以false Demo1 a1=getDemo1();
Demo1 a3=getDemo1(); System.out.println(a1==a3);
}
暂时懒汉式还存在线程安全问题,可以使用多线程修复

其他类访问 单例类 类名.方法名。

懒汉式饿汉式区别•
饿汉就是类一旦加载,就把单例初始化完成,保证getInstance的时候,单例是已经存在的了。
• 而懒汉比较懒,只有当调用getInstance的时候,才回去初始化这个单例。
• 单从资源利用效率角度来讲(饿汉比懒汉式单例类稍差些),但是从速度和反应时间角度来讲,饿汉比懒汉式单例类稍好
• 注意:懒汉式还存在线程安全问题,可以使用多线程修复
单例模式应用实例•
网站的计数器,一般也是采用单例模式实现,否则难以同步。
• 多线程的线程池的设计一般也是采用单例模式,这是由于线程池要方便对池中的线程
• 应用程序的日志应用,一般都何用单例模式实现,这一般是由于共享的日志文件一直处于打开状态,因为只能有一个实例去操作,否则内容不好追加行控制
• Spring 框架中 bean默认就是单例模式
工厂模式

工厂模式(Factory Pattern)是 Java 中最常用的设计模式之一。
这种类型的设计模式属于创建型模式,它提供了一种创建对象的最佳方式。
在工厂模式中,我们在创建对象时不会对客户端暴露创建逻辑,并且是通过使用一个共同的接口来指向新创建的对象。
**工厂模式使用意图:**定义一个创建对象的接口,让其子类自己决定实例化哪一个工厂类,工厂模式使其创建过程延迟到子类进行。
**主要解决:**主要解决接口选择的问题。
**何时使用:**我们明确地计划不同条件下创建不同实例时。
**如何解决:**让其子类实现工厂接口,返回的也是一个抽象的产品。
**关键代码:**创建过程在其子类执行。
应用实例: 1、您需要一辆汽车,可以直接从工厂里面提货,而不用去管这辆汽车是怎么做出来的,以及这个汽车里面的具体实现。
2、Hibernate 换
数据库只需换方言和驱动就可以。
优点:
1、一个调用者想创建一个对象,只要知道其名称就可以了。
2、扩展性高,如果想增加一个产品,只要扩展一个工厂类就可以。
3、屏蔽产品的具体实现,调用者只关心产品的接口。缺点:每次增加一个产品时,都需要增加一个具体类和对象实现工厂,使得系统中类的个数成倍增加,在一定程度上增加了系统的复杂度,同时也增加了系统具体类的依赖。这并不是什么好事

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值