设计模式 - 工厂模式

设计模式 - 工厂模式

一、简单(静态)工厂

A、抛出场景

一个外卖项目:要便于各种菜品的拓展,便于维护

菜品种类很多(黄焖鸡、大盘鸡等)

菜品制作有 prepare,make,package步骤

完成菜品的订购

B、基本介绍

  • 简单工厂模式是由一个工厂对象决定创建出哪一种产品类的实例。简单工厂模式是工厂模式中最简单的使用模式
Calendar calendar = Calendar.getInstance();

public static Calendar getInstance() {
    return createCalendar(TimeZone.getDefault(), Locale.getDefault(Category.FORMAT));
}

private static Calendar createCalendar(TimeZone var0, Locale var1) {
        CalendarProvider var2 = LocaleProviderAdapter.getAdapter(CalendarProvider.class, var1).getCalendarProvider();
        if (var2 != null) {
            try {
                return var2.getInstance(var0, var1);
            } catch (IllegalArgumentException var7) {
            }
        }

        Object var3 = null;
        if (var1.hasExtensions()) {
            String var4 = var1.getUnicodeLocaleType("ca");
            if (var4 != null) {
                byte var6 = -1;
                switch(var4.hashCode()) {
                case -1581060683:
                    if (var4.equals("buddhist")) {
                        var6 = 0;
                    }
                    break;
                case -752730191:
                    if (var4.equals("japanese")) {
                        var6 = 1;
                    }
                    break;
                case 283776265:
                    if (var4.equals("gregory")) {
                        var6 = 2;
                    }
                }

                switch(var6) {
                case 0:
                    var3 = new BuddhistCalendar(var0, var1);
                    break;
                case 1:
                    var3 = new JapaneseImperialCalendar(var0, var1);
                    break;
                case 2:
                    var3 = new GregorianCalendar(var0, var1);
                }
            }
        }

        if (var3 == null) {
            if (var1.getLanguage() == "th" && var1.getCountry() == "TH") {
                var3 = new BuddhistCalendar(var0, var1);
            } else if (var1.getVariant() == "JP" && var1.getLanguage() == "ja" && var1.getCountry() == "JP") {
                var3 = new JapaneseImperialCalendar(var0, var1);
            } else {
                var3 = new GregorianCalendar(var0, var1);
            }
        }

        return (Calendar)var3;
    }

二、工厂方法模式

A、模式介绍

定义创建方法的抽象方法,由子类决定要实例化的类。工厂方法模式将对象的实例化 在子类上。工厂方法模式是对简单(静态)工厂进一步的抽象提取

三、抽象工厂模式

### A.基本介绍

抽象工厂模式:定义了一个 interface 用于创建相关 或有依赖关系的对象簇,不用指明具体类

抽象工厂模式可以将简单工厂模式 和 工厂方法模式进行整合

从设计层面看,抽象工厂模式是对简单工厂模式的改进(进一步抽象)

将工厂抽象成两层,AbsFactory(抽象工厂)和 具体实现的工厂子类。根据创建对象类型使用对应的工厂子类。将单个的简单工厂类变成了工厂簇,更利于代码的维护和拓展。

{% abstractFactory.png slug %}

四、工厂模式总结

  1. 意义
    1. 将实例化代码提取出来,放到一个类中统一管理和维护,达到和项目的依赖关系解耦,提高项目的拓展和维护性。
  2. 三种工厂模式
  3. 依赖抽象原则
    1. 不要让类继承具体类,而是继承抽象类或者实现 interface(接口)
    2. 不覆盖基类中已经实现的方法

简单工厂是 建个工厂 不抽象的去创建 对象

工厂方法模式对 工厂进行抽象了一层,然后实现类去 担任 简单工厂里的工厂角色

抽象工厂模式是对 工厂方法模式 ,然后采用简单工厂模式的思想,对从一个总的抽象工厂中,细分每个抽象工厂(简单工厂模式思想)

全部评论

相关推荐

评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务