Java中的工厂设计模式是核心设计模式之一,工厂模式主要是为创建对象提供接口,以便将创建对象的具体过程屏蔽隔离起来,达到提高灵活性的目的。
工厂模式在业界主要有三种形式,分别是:
- 简单工厂(Simple Factory),又称静态工厂模式(static factory method)
- 工厂方法(Factory Method)
- 抽象工厂(Abstract Factory)
这三个模式都是创建型 这个这三个模式名字看着挺像,概念上容易让人比较混淆。本文就介绍一下这三种模式到底有什么区别。
我们在新建一个对象的时候最常见的是去new一个对象,但有时候:
举个栗子,我们在果园(FruitFacotry)里,果园里有各种各样的水果。我们想吃水果,但我并不想知道这些水果是怎么长出来的。也就是说做为一个果园的客户以及饥渴的吃货,我不关心你的水果是怎么长得,我上来就要吃你一个苹果一个橘子。
这个场景的代码是这样的:
public class ClientOfFruitFacotry { public static void main(String[] args){ Fruit apple = FruitFacory.create("APPLE"); apple.beEat(); Fruit orange = FruitFacory.create("ORANGE"); orange.beEat(); } }
那他是怎么实现的呢?非常简单我们可以这样定义FruitFactory:
public class FruitFacotry { public static Fruit create (String fruitName) throws Exception { if (fruitName.equalsIgnoreCase("APPLE")) return new Apple(); else if (fruitName.equalsIgnoreCase("ORANGE")) return new Orange(); else throw new Exception(); }
物品间的关系也很简单:
//抽象产品 public interface Fruit{ public void beEat(); } //具体产品 public class Apple implements Fruit{ public void beEat(){ System.out.println("eat apple"); } } public class Orange implements Fruit{ public void beEat(){ System.out.println("eat orange"); } }
如果你的代码代码中有许多对象有着相同的父类,同时你在使用这些对象时常常用到父类的方法,那么你需要使用这种方法。这样做的好处显而易见,果园负责生成果子,客户负责消费果子,客户不需要知道果子是怎么长的,这样就实现了职责的分离。但是也会有坏处。比如你想新加一种水果,那么你必须修改FruitFacotry这个类,这样违反了开闭原则,同时这个类中集合了所有的水果的创造逻辑。
有人会说你的这个类中会有大量的if-else语句。我们可以通过反射,hashmap,枚举等方法对这进行优化。