接着上一讲中的简单工厂继续讲解,假如我们有了需要采集新的水果梨子,如果我们使用简单工厂中的方式的话,就会新增一个Pear类,然后实现Fruit类,然后修改FruitFactory类中获取实例的方法 getFruitInstance,新增了if else,这样虽然解决了问题,但是却违反了“开放封闭”的原则,那么我们该怎么解决呢?
第一步:
我们可以新增一个抽象的工厂FruitFactory接口,在该方法中有一个getFruitInstance()方法,然后新增AppleFactory类,BananaFactory类,实现getFruitInstance()方法,返回具体的实例new Apple(),new Banana()
第二步:
这样我们在调用的时候就可以通过工厂实现多态获取具体的工厂,然后通过具体的工厂实例来获取相对应的水果实例
FruitFactory appleFactory = new AppleFactory();
Fruit fruitApple =
appleFactory.getFruitInstance();
fruitApple.get();
第三步:
假如我们需要采集新的水果梨子,那么我们只需要新增一个Pear类,然后实现Fruit类,再新增一个PearFactory类,实现FruitFactory接口,返回new Pear(),那么问题就不违反了“开放封闭”原则
代码如下:
Apple.java
package com.designpattern.factorymethod; public class Apple implements Fruit{ public void get(){ System.out.println("采集苹果"); } }
Banana.java
package com.designpattern.factorymethod; public class Banana implements Fruit{ public void get(){ System.out.println("采集香蕉"); } }
Pear.java
package com.designpattern.factorymethod; public class Pear implements Fruit { @Override public void get() { System.out.println("采集梨子"); } }
Fruit.java
package com.designpattern.factorymethod; public interface Fruit { public void get(); }
AppleFactory.java
package com.designpattern.factorymethod; public class AppleFactory implements FruitFactory { @Override public Fruit getFruitInstance() { return new Apple(); } }
BananaFactory.java
package com.designpattern.factorymethod; public class BananaFactory implements FruitFactory { @Override public Fruit getFruitInstance() { return new Banana(); } }
PearFactory.java
package com.designpattern.factorymethod; public class PearFactory implements FruitFactory { @Override public Fruit getFruitInstance() { return new Pear(); } }
FruitFactory.java
package com.designpattern.factorymethod; public interface FruitFactory { public Fruit getFruitInstance(); }
MainClass.java
package com.designpattern.factorymethod; public class MainClass { public static void main(String[] args) { FruitFactory appleFactory = new AppleFactory(); Fruit fruitApple = appleFactory.getFruitInstance(); fruitApple.get(); FruitFactory bananaFactory = new BananaFactory(); Fruit fruitBanana = bananaFactory.getFruitInstance(); fruitBanana.get(); /* * 此时,如果我再添加新的水果,就只需要添加一个水果类和工厂类,而无需改动其他类就可以实现 */ FruitFactory pearFactory = new PearFactory(); Fruit fruitPear = pearFactory.getFruitInstance(); fruitPear.get(); } }
一、什么是工厂方法模式
工厂方法模式同样属于类的创建型模式又被称为多态工厂模式 。工厂方法模式的意义是定义一个创建产品对象的工厂接口,将实际创建工作推迟到子类当中。核心工厂类不再负责产品的创建,这样核心类成为一个抽象工厂角色,仅负责具体工厂子类必须实现的接口,这样进一步抽象化的好处是使得工厂方法模式可以使系统在不修改具体工厂角色的情况下引进新的产品。
二、工厂方法模式和简单工厂模式比较
工厂方法模式与简单工厂模式在结构上的不同不是很明显。工厂方法类的核心是一个抽象工厂类,而简单工厂模式把核心放在一个具体类上。
工厂方法模式之所以有一个别名叫多态性工厂模式是因为具体工厂类都有共同的接口,或者有共同的抽象父类。
当系统扩展需要添加新的产品对象时,仅仅需要添加一个具体对象以及一个具体工厂对象,原有工厂对象不需要进行任何修改,也不需要修改客户端,很好的符合了“开放-封闭”原则。而简单工厂模式在添加新产品对象后不得不修改工厂方法,扩展性不好。
工厂方法模式退化后可以演变成简单工厂模式。