ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

设计模式-2工厂设计模式

2019-07-23 21:03:00  阅读:232  来源: 互联网

标签:zone 模式 工厂 aLocale cal new 设计模式


1.简单工厂模式(静态工厂模式)

传统的设计模式:

优点 简单理解,简单操作
缺点 违反了设计模式的OCP原则,即对扩展开放,对修改关闭的原则

简单工厂模式:

  • 属于创建型模式,简单工厂模式是由一个工厂对象决定创建出哪一种产品类的实例。简单工厂模式是工厂模式家族中最简单实用的模式
  • 定义了一个创建对象的类,由这个类来封装实例化对象的行为(代码)

2.工厂方法模式

​ 工厂方法模式:定义了一个创建对象的抽象方法,由子类决定要实例化的类。工厂方法模式将对象的实例化推迟到子类

3.抽象工厂模式

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

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

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

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

4、工厂模式模式

​ 在jdk中的例子:

Calendar calendar = Calendar.getInstance();
//二级
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) {
            // fall back to the default instantiation
        }
    }

    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 no known calendar type is explicitly specified,
        // perform the traditional way to create a Calendar:
        // create a BuddhistCalendar for th_TH locale,
        // a JapaneseImperialCalendar for ja_JP_JP locale, or
        // a GregorianCalendar for any other locales.
        // NOTE: The language, country and variant strings are interned.
        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;
}

小结:

  • 意义:将实例化对象的代码提取出来,放到一个类中统一管理和维护,达到和主项目的依赖关系的解耦。从而提高项目的扩展和维护性。
  • 设计模式的依赖抽象原则
    • 创建对象实例的时候,不要直接new,而是把这个new类的动作放在一个工厂的方法中,并返回。
    • 不要让类继承具体类,而是继承抽象或者是实现interface(接口)
    • 不要覆盖基类中已经实现的方法

标签:zone,模式,工厂,aLocale,cal,new,设计模式
来源: https://www.cnblogs.com/lovestart/p/11234367.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有