简单工厂 Simple Factory
Posted 有且仅有
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了简单工厂 Simple Factory相关的知识,希望对你有一定的参考价值。
父博文地址:设计模式 - Design Patterns
一、是什么?
简单工厂(通常也被称为“工厂模式”)并不属于GoF的23个设计模式,是另外的一个被广泛运用的设计模式。
作用
当我需要将“客户”和“具体产品以及创建产品对象的代码”解耦时,可以使用简单工厂。
实现了解耦客户和具体产品。
行为
- 将创建对象的代码搬到一个新类中,称为简单工厂类,提供成员方法或静态方法根据传入参数来创建不同产品。
二、实例
简单工厂类更多时候会使用static
而不是实例方法,这样会更方便毕竟无需创建工厂类的实例。
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();
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)