简单工厂模式-Simple Factory
一、定义
简单工厂模式的定义如下:
提供一个创建对象实例的功能,而无需关心其具体实现。被创建实例的类型可以是接口、抽象类,也可以是具体的类。
简单工厂模式,又叫做静态工厂方法。简单工厂其实并不是一种设计模式,反而比较像一种编程习惯,因为使用的非常频繁,所以有些书籍(如《Java与模式》)将其当做一种设计模式。简单工厂方法模式是由一个工厂对象决定创建出哪一种产品类的实例。
二、类图
三、示例
以果汁工厂生产果汁的例子,来说明简单工厂模式。
果汁接口
/** * 水果汁(抽象产品) */ public interface FruitJuice { void discribeSelf(); }
苹果汁和葡萄汁
/** * 苹果汁(具体产品) */ public class AppleJuice implements FruitJuice { @Override public void discribeSelf() { System.out.println("我是你的小呀小苹果汁,快来喝我"); } } /** * 葡萄汁(具体产品) */ public class GrapeJuice implements FruitJuice { @Override public void discribeSelf() { System.out.println("我是葡萄汁,喝不到我就说我酸"); } }
果汁工厂
/** * 果汁类别枚举类 */ public enum FruitJuiceType { APPLE_JUICE, GRAPE_JUICE } /** * 果汁工厂 */ public class JuiceFactory { public static FruitJuice createJuice(FruitJuiceType type) { if (FruitJuiceType.APPLE_JUICE == type) { return new AppleJuice(); } if (FruitJuiceType.GRAPE_JUICE == type) { return new GrapeJuice(); } return null; } }
客户端代码
public class Client { public static void main(String[] args) { //果汁工厂,生产苹果汁 AppleJuice appleJuice = (AppleJuice) JuiceFactory.createJuice(FruitJuiceType.APPLE_JUICE); appleJuice.discribeSelf(); //果汁工厂,生产葡萄汁 GrapeJuice grapeJuice = (GrapeJuice) JuiceFactory.createJuice(FruitJuiceType.GRAPE_JUICE); grapeJuice.discribeSelf(); } }
四、优缺点
优点:
简单工厂模式仅使用了一个工厂类,无论产品体系如何变化,都由此工厂产生产品。 这样做的好处是设计简单,产品类的等级结构不会反映到工厂类中来,从而产品类的等级结构变化也就不会影响到工厂类。
缺点:
1.违背了开闭原则(对拓展开放,对修改关闭)。如果有新的产品加入到系统中,就必须修改工厂类,将必要的逻辑加入到工厂类中。
2.工厂类中集中了所有产品创建的逻辑,成为了无所不知的全能类(有人称其为上帝类)。当产品越来越多时,工厂类负担就会太重,不好维护。
简单工厂模式的缺点在工厂方法模式中得到改善。
不积跬步,无以至千里。不积小流,无以成江海!