“设计模式是软件开发人员在开发过程中可以遵循的一般问题的解决方案。”
简介
简单工厂模式是最简单的设计模式之一,简单到甚至没有放到23种常用设计模式当中,可以用于设计模式的入门学习。
目的
定义一个创建对象的接口,在工厂中决定实例化哪个对象的子类,解决了接口选择的问题
优缺点
优点
- 实现了子类对象创建和使用的分离
- 无需知道子类的类名,通过参数即可创建子类对象
- 屏蔽了子类的具体实现
缺点
- 每次增加新产品时,都需要修改工厂类,违反了开闭原则
- 产品和工厂类之间的依赖较大
实现
我们将创建一个Fruit
接口和实现Fruit
接口的实体类,以及工厂类FruitFactory
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64
| interface Fruit { void describe(); }
class Apple implements Fruit { @Override public void describe() { System.out.println("我是苹果"); } }
class Pear implements Fruit { @Override public void describe() { System.out.println("我是梨"); } }
class Orange implements Fruit { @Override public void describe() { System.out.println("我是橙子"); } }
class FruitFactory {
public Fruit getFruit(String name) { if (name == null) { return null; } if (name.equalsIgnoreCase("apple")) { return new Apple(); } else if (name.equalsIgnoreCase("pear")) { return new Pear(); } else if (name.equalsIgnoreCase("orange")) { return new Orange(); } return null; } }
public class SimpleFactoryPattern {
public static void main(String[] args) { FruitFactory fruitFactory = new FruitFactory(); Fruit apple = fruitFactory.getFruit("apple"); apple.describe(); Fruit pear = fruitFactory.getFruit("pear"); pear.describe(); Fruit orange = fruitFactory.getFruit("orange"); orange.describe(); } }
|
输出为:
使用场景
当我们明确知道传入工厂的参数且对如何创建对象不关心时可以使用此方法,尽量在工厂中创建类型较少时采用此方法,以免工厂类过于复杂。