23种设计模式之抽象工厂模式和枚举类单例模式

先说一下枚举类单例模式 也是我们最常用的 这种实现也是最佳的 防止反射 如果反射枚举类型就会报错 因为源码中通过反射获取枚举类 会被过滤掉 就是说我们不能通过反射机制去获取枚举的实例

    public static enum SingletonEnum{

        SINGLETON;

        private Singleton singleton = null;

        private SingletonEnum(){
            singleton = new Singleton();
        }

        public Singleton getSingleton(){
            return singleton;
        }

    }

测试一下

    public static void main(String[] args) {
        for (int i = 0; i < 10000; i++) {
            new Thread(()->{
                try {
                    Thread.sleep(4000);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
                System.out.println(SingletonEnum.SINGLETON.getSingleton());
            }).start();
        }
    }

结果:

完全没问题嗷 分析一下  因为枚举类型的构造方法只能调用一次 所以只创建一个对象   所以这个是线程安全 也是比较常见的

 介绍一下抽象工厂模式  比较简单  抽象工厂模式是一种创建型模式。本质上就是工厂模式的大集合。比如我们有两个工厂,衣服工厂和裤子工厂,抽象 工厂就将这两个工厂进行整合。我们无论是要衣服和裤子都管抽象工厂要就可以,告诉他品牌和型号就可以得到具体 的衣服裤子。

直接看代码更容易懂

定义一个手机工厂 和  路由器工厂 

/**
 * @Auther: XiaoShe
 * @DateTime: 2023/6/16 12:11
 * @Description: 手机工厂
 */
public interface PhoneProduct {

    //手机开机
    void start();

    //手机打电话
    void callUp();

}

/**
 * @Auther: XiaoShe
 * @DateTime: 2023/6/16 12:12
 * @Description: 路由器工厂
 */
public interface RouterProduct {

    // 开机
    void start();

    //打开wifi
    void openWifi();

}

实现华为手机和华为路由器 小米手机和 小米路由器实现类

/**
 * @Auther: XiaoShe
 * @DateTime: 2023/6/16 12:14
 * @Description:
 */
public class HuaWeiPhone implements PhoneProduct{

    @Override
    public void start() {
        System.out.println("华为手机开机");
    }

    @Override
    public void callUp() {
        System.out.println("华为手机打电话");
    }

}

/**
 * @Auther: XiaoShe
 * @DateTime: 2023/6/16 12:15
 * @Description:
 */
public class HuaWeiRouter implements RouterProduct {

    @Override
    public void start() {
        System.out.println("华为路由器开机");
    }

    @Override
    public void openWifi() {
        System.out.println("华为路由器打开WiFi");
    }

}


/**
 * @Auther: XiaoShe
 * @DateTime: 2023/6/16 12:16
 * @Description:
 */
public class XiaoMiPhone implements PhoneProduct {

    @Override
    public void start() {
        System.out.println("小米手机开机");
    }

    @Override
    public void callUp() {
        System.out.println("小米手机打电话");
    }
}



/**
 * @Auther: XiaoShe
 * @DateTime: 2023/6/16 12:17
 * @Description:
 */
public class XiaoMiRouter implements RouterProduct{

    @Override
    public void start() {
        System.out.println("小米路由器开机");
    }

    @Override
    public void openWifi() {
        System.out.println("小米路由器打开WiFi");
    }

}

实现华为手机工厂 和小米手机工厂

/**
 * @Auther: XiaoShe
 * @DateTime: 2023/6/16 12:22
 * @Description:
 */
public class XiaoMiFactory implements ProductFactory {

    @Override
    public PhoneProduct phoneFactory() {
        return new XiaoMiPhone();
    }

    @Override
    public RouterProduct routerFactory() {
        return new XiaoMiRouter();
    }

}


/**
 * @Auther: XiaoShe
 * @DateTime: 2023/6/16 12:21
 * @Description:
 */
public class HuaWeiFactory implements ProductFactory{

    @Override
    public PhoneProduct phoneFactory() {
        return new HuaWeiPhone();
    }

    @Override
    public RouterProduct routerFactory() {
        return new HuaWeiRouter();
    }

}

实现产品工厂总接口:

/**
 * @Auther: XiaoShe
 * @DateTime: 2023/6/16 12:18
 * @Description:
 */
public interface ProductFactory {

    PhoneProduct phoneFactory();

    RouterProduct routerFactory();

}

测一下


/**
 * @Auther: XiaoShe
 * @DateTime: 2023/6/16 12:24
 * @Description:
 */
public class AbstractFactoryPatternDemo {

    public static void main(String[] args) {
        System.out.println("=============华为产品===============");
        ProductFactory huaweiFactory = new HuaWeiFactory();
        PhoneProduct huaweiPhoneProduct = huaweiFactory.phoneFactory();
        huaweiPhoneProduct.start();
        huaweiPhoneProduct.callUp();

        RouterProduct huaweiRouterProduct = huaweiFactory.routerFactory();
        huaweiRouterProduct.start();
        huaweiRouterProduct.openWifi();

        System.out.println("=============小米产品===============");
        ProductFactory xiaoMiFactory = new XiaoMiFactory();
        PhoneProduct xiaomiPhoneProduct = xiaoMiFactory.phoneFactory();
        xiaomiPhoneProduct.start();
        xiaomiPhoneProduct.callUp();

        RouterProduct xiaomiRouterProduct = xiaoMiFactory.routerFactory();
        xiaomiRouterProduct.start();
        xiaomiRouterProduct.openWifi();


    }

}

结果:

感觉没问题 比较简单 学会了 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值