简单工厂设计模式
-
简单介绍
简单工厂模式属于创建型设计模式,是工厂模式的一种实现。简单工厂模式中,专门有一个负责创建各类产品实例的对象(即工厂对象),并提供一个静态方法(故简单工厂有称为静态工厂),返回创建好的实例对象。
-
使用场景
想要隔离具体实现,让客户端只通过接口便能得到想要的实例对象。 把创建对象的职责进行集中、统一的管理和控制 。
-
场景举例
JDK中的Calendar类,根据客户端给定的Local参数返回具体的实现类。屏蔽了Calendar类的具体实现细节,给客户端的使用带来便捷。
-
UML类图
-
具体实现
-
故事背景
樱桃公司(CherryCompany)是一家连锁水果公司,对外售卖的水果品种高达数十种。在公司成立初期,创始人承包了一大片农场,专门用于种植各种水果,再对外出售这些水果。此时的樱桃公司,所有的水果都是自己生产的。此时如果有客户预定苹果(Apple)、香蕉(Banana)樱桃公司的运作模式可以用以下伪代码来描述:
public class Apple { }
public class Banana { }
public class CherryCompany { // 由樱桃公司亲自种苹果(创建实例) public Apple getApple() { return new Apple(); } // 由樱桃公司亲自种香蕉(创建实例) public Banana getBanana() { return new Banana(); } }
这种自产自销的模式在运营了一段时间后,樱桃公司发现了此种模式的弊端,有些水果的生产周期长,种植成本大,但市场上的价格却不高。这直接导致这些水果种植销售处于长期亏本状态。于是该公司决定将水果的来源从自种改为从农场(Farm,即工厂)进货。此时如果有客户预定苹果(Apple)、香蕉(Banana)樱桃公司的运作模式可以用以下伪代码来描述:
/** * 水果的抽象类 */ public abstract Fruit { }
public class Apple extends Fruit { }
public class Banana extends Fruit { }
/** * 农场负责具体的水果生成 */ public class Farm { public static getFruit(int type) { // 根据type类型创建具体的水果 if (type == 1) { return new Apple(); } else if (type == 2) { return new Banana(); } } }
public class CherryCompany { // 客户预定苹果,将苹果生产的任务交给农场 public Fruit getApple() { return Farm.getFruit(1); } // 客户预定香蕉,将香蕉生产的任务交给农场 public Fruit getBanana() { return Farm.getFruit(2); } }
-
-
源码展示
-
JDK中日历类部分源代码
public abstract class Calendar { private static Calendar createCalendar(TimeZone zone, Locale aLocale) { Calendar cal = null; if (aLocale.hasExtensions()) { String caltype = aLocale.getUnicodeLocaleType("ca"); if (caltype != null) { // 根据caltype创建具体的实例对象 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; } } } return cal; }
-