Java设计模式:工厂模式与单例模式

引言

        作为一名使用Java语言来活着的程序员,理解并且熟练使用Java中的设计模式是必备项。目前的形式是在实习生面试的时候就会被要求手搓工厂等模式(别问我咋知道的)。 本文为大家演示工厂模式和单例模式。       

        设计模式(Design pattern)代表了最佳的实践,通常被有经验的面向对象的软件开发人员所采用。设计模式是软件开发人员在软件开发过程中面临的一般问题的解决方案。这些解决方案是众多软件开发人员经过相当长的一段时间的试验和错误总结出来的。

工厂模式

工厂模式最大的作用就是对实现了同一接口的类进行实例创建,使得创建对象的过程和使用对象的过程分离。有利于提高代码的可维护性和可扩展性。

准备

hi接口

package shejimoshi.gongchang;

public interface hi {
    void hi();
}

personA类与personB类都实现hi接口

package shejimoshi.gongchang;

public class peosonA implements hi{
    @Override
    public void hi() {
        System.out.println("你好,我是a");
    }
}
package shejimoshi.gongchang;

public class personB implements hi{
    @Override
    public void hi() {
        System.out.println("你好,我是b");
    }
}

简单工厂模式

严格意义上说并不是一个正式的设计模式,但是它是工厂模式的基础。通过传入不同的参数使用工厂进行对象的创建。工厂类

public class factory {

    public hi createPserson(String name)
    {
        if (name.equals("a")){
            return new peosonA();
        }else if (name.equals("b")){
            return new personB();
        }
        return null
    }

}

test测试类

public class test {
    public static void main(String[] args) {
        factory factory = new factory();
        hi a = factory.createPserson("a");
        a.hi();
    }
}

工厂方法模式

工厂方法模式定义了一个创建对象的接口,但由子类决定实例化哪个类。工厂方法将对象的创建延迟到子类。工厂类

public class factory {


    public peosonA createPeosonA() {
        return new peosonA();
    }
    public personB createPersonB() {
        return new personB();
    }
}

test测试类

public class test {
    public static void main(String[] args) {
        factory factory = new factory();
        peosonA peosonA = factory.createPeosonA();
        peosonA.hi();
    }
}

单例模式

这种类型的设计模式属于创建型模式,它提供了一种创建对象的最佳方式。这种模式涉及到一个单一的类,该类负责创建自己的对象,同时确保只有单个对象被创建。这个类提供了一种访问其唯一的对象的方式,可以直接访问,不需要实例化该类的对象。省去了new操作符,降低了系统内存的使用频率,减轻GC压力。

设计单例模式有很多种,例如使用静态内部类、双检锁等方式。这两种方式都是懒加载且都是线程安全的。

静态内部类方式

public class User {
    
    //构造方法私有,防止被实例化
    private User(){};

    //构建内部类,创建user实例,
    //jvm内部机制,在一个类加载过程的时候是线程互斥的,第一次调用getInstance,jvm会确保实例被创建一次
    private static class UserCreate{
        private static User user = new User();
    }
    public static User getInstance(){
        return UserCreate.user;
    }
    //防止序列化
    private Object readReslove(){
        return getInstance();
    }
}

测试是否只创建一个User实例

public class test {
    public static void main(String[] args) {

        User user1 = User.getInstance();
        for (int i=1;i<10;i++){
            User user = User.getInstance();
            System.out.println(user);
        }

     
    }
}

 观察地址

 双检锁方式

这种方式采用双锁机制,安全且在多线程情况下能保持高性能。getUser() 的性能对应用程序很关键。

public class User {
    private volatile static User user;
    private User(){};
    private static User getUser(){
        if (user==null){
            synchronized (User.class){
                if (user==null){
                    user = new User();
                }
            }
        }
        return user;
    }
}

总结

设计模式是极为重要的,本篇文章演示的工厂模式和单例模式是日常开发中经常使用的,并且Spring框架中也涉及到了这两种模式,希望大家能好好理解,欢迎大家指正!!

  • 4
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值