【2023-05-09】 设计模式(单例,工厂)

这篇具有很好参考价值的文章主要介绍了【2023-05-09】 设计模式(单例,工厂)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

2023-05-09 设计模式(单例,工厂)

单例模式

顾名思义,就是整个系统对外提供的实例有且只有一个

特点:

​ 1、单例类只有一个实例

​ 2、必须是自己创建唯一实例

​ 3、必须给所以对象提供这个实例

分类:一般分为饿汉式单例(直接实例化)和懒汉式单例(使用时才实例化)

饿汉式单例

public class SingletonTest {
    //构造器私有化,防止外部调用
    private SingletonTest() {
    }
    //直接实例化
    private static SingletonTest sin = new SingletonTest();
    
    public static SingletonTest getInstance(){
        return sin;
    }
}

懒汉式单例

同步锁(当然还有简单的,去掉synchronized,只是存在安全问题)

public class SingletonTest1 {
    //构造器私有化,防止外部调用
    private SingletonTest1() {
    }

    private static SingletonTest1 sin = null;

    //使用同步锁保证一定会创建,并且只会创建一次
    public static synchronized SingletonTest1 getInstance(){
        if(sin == null){
            sin = new SingletonTest1();
        }
        return sin;
    }
}

双重检测锁

public class SingletonTest2 {
    //构造器私有化,防止外部调用
    private SingletonTest2() {
    }

    //使用volatile,在这里的作用是禁止指令重排
    //sin = new SingletonTest2();不是一个原子操作
    //第一步、申请内存,第二步、初始化,第三步、地址引用给sin
    //如果第三步在第二步前面就执行了,此时另一个现场通过getInstance获取实例时进来判断就不为null了,直接返回,而这个时候其实还并没有实例化
    //synchronized只能保证代码块相较于外面是正常顺序,代码块内部还是可能由于指令优化导致第三步在第二步前面就执行了
    private static volatile SingletonTest2 sin = null;

    //为什么要判断两次呢
    //第一次是为了减少同步,不用每次进来都去加锁
    //第二次是如果现在有两个现场同时竞争锁,那必然有一个是处于阻塞状态的
    //当处于阻塞状态的线程拿到锁后,前面的线程肯定是已经创建过实例了
    //如果这个时候不判断一下的话就会有实例化一次
    public static SingletonTest2 getInstance(){
        if(sin == null){
            synchronized (SingletonTest2.class){
                if(sin == null){
                    sin = new SingletonTest2();
                }
            }
        }
        return sin;
    }
}

内部类

public class SingletonTest3 {
    //构造器私有化,防止外部调用
    private SingletonTest3() {
    }

    private static SingletonTest3 sin = null;

    public static SingletonTest3 getInstance(){
        return SingletonClass.singleton;
    }

    //内部类只有在使用的时候才会初始化,其中初始化是jvm控制的,单线程操作,保证了线程安全,也实现了懒汉式
    private static class SingletonClass{
        private static SingletonTest3 singleton = new SingletonTest3();
    }
}

工厂模式

工厂模式主要是为了屏蔽创建对象的过程,主要分为三类(静态工厂,普通工厂,抽象工厂)

静态工厂(简单工厂)

public interface FactoryTest {
    void doSome();
}

public class FactoryTest1 implements FactoryTest {
    @Override
    public void doSome() {
        System.out.println("FactoryTest1");
    }
}

public class FactoryTest2 implements FactoryTest {
    @Override
    public void doSome() {
        System.out.println("FactoryTest2");
    }
}

public class StaticFactory {
    public static FactoryTest creatTest(String name){
        if("FactoryTest1".equals(name)){
            return new FactoryTest1();
        }else if("FactoryTest2".equals(name)){
            return new FactoryTest2();
        }
        return null;
    }
}

public class Test1 {
    public static void main(String[] args) {
        //通过StaticFactory工厂创建对应的实例类
        FactoryTest factoryTest1 = StaticFactory.creatTest("FactoryTest1");
        factoryTest1.doSome();
        FactoryTest factoryTest2 = StaticFactory.creatTest("FactoryTest2");
        factoryTest2.doSome();
    }
}

每次新增一个FactoryTest时,需要修改StaticFactory.creatTest()方法,这样不合理,所以有了普通工厂模式

普通工厂

public interface FactoryTest {
    void doSome();
}

public class FactoryTest1 implements FactoryTest {
    @Override
    public void doSome() {
        System.out.println("FactoryTest1");
    }
}

public class FactoryTest2 implements FactoryTest {
    @Override
    public void doSome() {
        System.out.println("FactoryTest2");
    }
}

public interface ICommonFactory {
    FactoryTest createTest();
}

public class CommonFactory1 implements ICommonFactory {
    @Override
    public FactoryTest createTest() {
        return new FactoryTest1();
    }
}

public class CommonFactory2 implements ICommonFactory {
    @Override
    public FactoryTest createTest() {
        return new FactoryTest2();
    }
}

public class Test1 {
    public static void main(String[] args) {
        //通过CommonFactory1工厂创建对应的实例类
        new CommonFactory1().createTest().doSome();
        new CommonFactory2().createTest().doSome();
    }
}

每次新增一个FactoryTest时,只需要新增一个对应的CommonFactory工厂实现类就行,对于之前的工厂和对象不影响

抽象工厂

现在有手机和平板,可以使用上述的普通工厂来创建,但现在给手机和平板分了牌子,有华为手机和苹果手机,华为平板和苹果平板,这样一个产品族的概念(分为手机和平板两个产品族,手机产品族里面包含了华为手机和苹果手机两个产品),那么就可以使用抽象工厂模式。文章来源地址https://www.toymoban.com/news/detail-437699.html

//手机产品族
public interface Phone {
    void doSome();
}
public class PhoneHuawei implements Phone {
    @Override
    public void doSome() {
        System.out.println("华为手机");
    }
}
public class PhonePinguo implements Phone {
    @Override
    public void doSome() {
        System.out.println("苹果手机");
    }
}

//平板产品族
public interface Tablet {
    void doSome();
}
public class TabletHuawei implements Tablet {
    @Override
    public void doSome() {
        System.out.println("华为平板");
    }
}
public class TabletPinguo implements Tablet {
    @Override
    public void doSome() {
        System.out.println("苹果平板");
    }
}

//工厂
public interface AbsFactory {
    Phone buyPhone();
    Tablet buyTablet();
}
//华为工厂
public class HuaweiFatory implements AbsFactory{
    @Override
    public Phone buyPhone() {
        return new PhoneHuawei();
    }

    @Override
    public Tablet buyTablet() {
        return new TabletHuawei();
    }
}
//苹果工厂
public class PinguoFatory implements AbsFactory{
    @Override
    public Phone buyPhone() {
        return new PhonePinguo();
    }

    @Override
    public Tablet buyTablet() {
        return new TabletPinguo();
    }
}

public class Test1 {
    public static void main(String[] args) {
        HuaweiFatory huaweiFatory = new HuaweiFatory();
        huaweiFatory.buyPhone().doSome();
        huaweiFatory.buyTablet().doSome();

        PinguoFatory pinguoFatory = new PinguoFatory();
        pinguoFatory.buyPhone().doSome();
        pinguoFatory.buyTablet().doSome();
    }
}

到了这里,关于【2023-05-09】 设计模式(单例,工厂)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 设计模式-创建型模式(单例、工厂、建造、原型)

    设计模式:软件设计中普遍存在(反复出现)的各种问题,所提出的解决方案。 面向对象三大特性:封装、继承、多态。 面向对象设计的SOLID原则: (1)开放封闭原则:一个软件实体如类、模块和函数应该对扩展开放,对修改关闭。即软件实体应尽量在不修改原有代码的情

    2024年02月08日
    浏览(53)
  • Python入门【​编辑、组合、设计模式_工厂模式实现 、设计模式_单例模式实现、工厂和单例模式结合、异常是什么?异常的解决思路 】(十七)

    👏作者简介:大家好,我是爱敲代码的小王,CSDN博客博主,Python小白 📕系列专栏:python入门到实战、Python爬虫开发、Python办公自动化、Python数据分析、Python前后端开发 📧如果文章知识点有错误的地方,请指正!和大家一起学习,一起进步👀 🔥如果感觉博主的文章还不错的

    2024年02月14日
    浏览(44)
  • java基础之设计模式(单例模式,工厂模式)

    是一种编码套路 单例模式 一个类只能创建一个实例 饿汉式 直接创建唯一实例 缺点: 有可能浪费空间 懒汉式 在获取实例是创建唯一对象 缺点: 线程效率慢 懒汉式-进阶版 在懒汉式的基础上,利用同步代码块结合二次校验提高执行效率 工厂模式 是一种底层技术,通常用于底层框

    2024年01月18日
    浏览(45)
  • 创建型设计模式05-抽象工厂模式

    ✨作者:猫十二懿 ❤️‍🔥账号:CSDN 、掘金 、个人博客 、Github 🎉公众号:猫十二懿 抽象工厂模式(Abstract Factory Pattern)是一种创建型设计模式,围绕一个超级工厂创建其他工厂,也称作为工厂的工厂(大工厂里的小工厂)。在抽象工厂模式中, 接口负责创建一组相关对

    2024年02月07日
    浏览(42)
  • 【java设计模式】创建型模式介绍(工厂模式、抽象工厂模式、单例模式、建造者模式、原型模式)

    简介 本文介绍Java设计模式中创建型模式的五种 一、工厂模式 工厂模式(Factory Pattern)是 Java 中最常用的设计模式之一。这种类型的设计模式属于创建型模式,它提供了一种创建对象的最佳方式。 工厂模式提供了一种将对象的实例化过程封装在工厂类中的方式。通过使用工

    2024年02月16日
    浏览(46)
  • day39 注解 设计模式(单例模式和工厂模式)

    @Target    @Target(ElementType.TYPE) @Target({                 ElementType.TYPE,                          ElementType.METHOD}) //确定自定义的注解的使用范围 type为类  method为方法  field为属性 @Retention @Retention()  //(不添加参数默认是class) @Retention(RetentionPolicy.CLASS)// 保留到

    2024年02月09日
    浏览(37)
  • Java中23种设计模式-单例模式--工厂模式

    加油,新时代打工人! 23种设计模式定义介绍 Java中23种设计模式-单例模式 Java中23种设计模式-单例模式2–懒汉式线程不安全 Java中23种设计模式-单例模式2–懒汉式2线程安全 Java中23种设计模式-单例模式–饿汉式 定义: 工厂模式(Factory Pattern)是 Java 中最常用的设计模式之一

    2024年02月21日
    浏览(38)
  • 设计模式(单例模式、工厂模式及适配器模式、装饰器模式)

    目录 0 、设计模式简介 一、单例模式 二、工厂模式 三、适配器模式 四、装饰器模式  设计模式可以分为以下三种:  创建型模式: 用来描述 “如何创建对象” ,它的主要特点是 “将对象的创建和使用分离”。包括 单例 、原型、 工厂方法 、 抽象工厂 和建造者 5 种模式。

    2024年02月06日
    浏览(40)
  • 前端设计模式:工厂方法模式、单例模式、订阅模式、中介者模式

    工厂方法模式是一种创建型设计模式,它提供了一种将对象的创建与使用分离的方式。在工厂方法模式中,我们定义一个工厂接口,该接口声明了一个用于创建对象的方法。具体的对象创建则由实现该接口的具体工厂类来完成。 工厂方法模式的核心思想是将对象的创建延迟到

    2024年02月12日
    浏览(53)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包