简单工厂 Simple Factory

Posted 有且仅有

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了简单工厂 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;
    

    以下是客户的调用:

    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");
    

以上是关于简单工厂 Simple Factory的主要内容,如果未能解决你的问题,请参考以下文章

简单工厂模式(simple-factory-pattern)

简单工厂模式(Simple Factory Pattern)

简单工厂 Simple Factory

简单工厂 Simple Factory

设计模式的征途—2.简单工厂(Simple Factory)模式

浅析设计模式——创建型模式之simple-factory(简单工厂方法,非设计模式)