父博文地址:设计模式 - 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"); }