设计模式之工厂模式

╄→гoц情女王★ 提交于 2020-02-12 12:13:05

(最近在家中自学设计模式,参考网上的视频,做简单的理解记忆)工厂模式的设计也是为了减少对象之间的耦合关系。
不适用设计模式的订购与产品UML类图
在这里插入图片描述
如果不使用工厂模式,Pizza父类下有其子类不同的设计与实现,对于客户端OrderPizza对象就需要依赖Pizza以及依赖其子类,这样对象之间的耦合程度加大,如果有多个OrderPizza客户端时,每个客户端对象都需要依赖其他类。

简单工厂模式:是由一个工厂对象决定创建出哪一个产品类的实例对象

使用简单工厂的UML类图:
在这里插入图片描述
使用简单工厂设计模式,由工厂进行创建需要的产品类的实例对象。

工厂方法模式,对于同一个产品可能有多个工厂进行设计实现,其实现的方式或许有所不同,客户端访问时可以选择不同的工厂来进行创建不同的产品实例对象,但是不同的工厂会遵循相同的某种规则进行指定。

工厂方法模式的UML类图:
在这里插入图片描述

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

抽象工厂相当于将简单工厂与工厂方法模式整合的结果。


工厂模式的使用场景:jdk中的Calendar类使用的是工厂模式
简单的源码如下:

//Calendar 类中的实例创建方法
  public static Calendar getInstance()
    {
        return createCalendar(TimeZone.getDefault(), Locale.getDefault(Locale.Category.FORMAT));
    }

 //具体的方法如下
 private static Calendar createCalendar(TimeZone zone,
                                           Locale aLocale)
    {
        CalendarProvider provider =
            LocaleProviderAdapter.getAdapter(CalendarProvider.class, aLocale)
                                 .getCalendarProvider();
        if (provider != null) {
            try {
                return provider.getInstance(zone, aLocale);
            } catch (IllegalArgumentException iae) {
            }
        }

        Calendar cal = null;

        if (aLocale.hasExtensions()) {
            String caltype = aLocale.getUnicodeLocaleType("ca");
            if (caltype != null) {
                switch (caltype) {
                case "buddhist":
                cal = new BuddhistCalendar(zone, aLocale);
                    break;
                case "japanese":
                    cal = new JapaneseImperialCalendar(zone, aLocale);
                    break;
                case "gregory":
                    cal = new GregorianCalendar(zone, aLocale);
                    break;
                }
            }
        }
        if (cal == null) {
            if (aLocale.getLanguage() == "th" && aLocale.getCountry() == "TH") {
                cal = new BuddhistCalendar(zone, aLocale);
            } else if (aLocale.getVariant() == "JP" && aLocale.getLanguage() == "ja"
                       && aLocale.getCountry() == "JP") {
                cal = new JapaneseImperialCalendar(zone, aLocale);
            } else {
                cal = new GregorianCalendar(zone, aLocale);
            }
        }
        return cal;
    }

工厂模式是将需要实例化的类进行同一管理和维护,进行与主项目解耦,提高项目的扩展性和维护性。

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!