简单工厂 Simple Factory

父博文地址:设计模式 - Design Patterns


一、是什么?

简单工厂(通常也被称为“工厂模式”)并不属于GoF的23个设计模式,是另外的一个被广泛运用的设计模式。

作用

  1. 当我需要将“客户”和“具体产品以及创建产品对象的代码”解耦时,可以使用简单工厂。

  2. 实现了解耦客户和具体产品。

行为

  • 将创建对象的代码搬到一个新类中,称为简单工厂类,提供成员方法或静态方法根据传入参数来创建不同产品。

这里写图片描述

二、实例

简单工厂类更多时候会使用static而不是实例方法,这样会更方便毕竟无需创建工厂类的实例。

  1. java.util.Calendar#getInstance()

    以下是一个简单工厂:

    // 不需要参数的简单工厂
    public static Calendar getInstance() {
        // 这里代码被封装了一层
        Calendar cal = createCalendar(TimeZone.getDefaultRef(), Locale.getDefault(Locale.Category.FORMAT));
        cal.sharedZone = true;
        return cal;
    }
    // 
    private static Calendar createCalendar(TimeZone zone, Locale aLocale) {
        Calendar cal = null;
        String caltype = aLocale.getUnicodeLocaleType("ca");
        if (caltype == null) {
            if ("th".equals(aLocale.getLanguage())
                    && ("TH".equals(aLocale.getCountry()))) {
                cal = new BuddhistCalendar(zone, aLocale);
            } else {
                cal = new GregorianCalendar(zone, aLocale);
            }
        } else if (caltype.equals("japanese")) {
            cal = new JapaneseImperialCalendar(zone, aLocale);
        } else if (caltype.equals("buddhist")) {
            cal = new BuddhistCalendar(zone, aLocale);
        } else {
            cal = new GregorianCalendar(zone, aLocale);
        }
        return cal;
    }

    以下是客户的调用:

    扫描二维码关注公众号,回复: 1055546 查看本文章
    public static void main(String[] args) {
        // 原始方法:客户需要依赖具体对象
        // Calendar calendar = new GregorianCalendar();
    
        // 简单工厂:分离客户和具体对象,客户只依赖抽象
        Calendar calendar = Calendar.getInstance();
    }
  2. java.nio.charset.Charset#forName

    以下是简单工厂:

    public static Charset forName(String charsetName) {
        // 具体实现就不看了,总之最里面是根据charsetName来实际创建对象
        Charset cs = lookup(charsetName);
        if (cs != null)
            return cs;
        throw new UnsupportedCharsetException(charsetName);
    }

    以下是客户调用:

    public static void main(String[] args) {
        // 简单工厂:分离客户和具体对象,客户只依赖抽象。运行时能获取实际子对象
        Charset charset = Charset.forName("UTF-8");
    }

猜你喜欢

转载自blog.csdn.net/u010297957/article/details/80378858