工厂模式专门将大量有共同接口的类实例化。工厂模式可以动态决定将哪一个类实例化,不必事先知道每次要实例化哪个类。工厂模式有以下几种形态:
简单工厂模式(Simple Factory):又称静态工厂模式(Static Factory Method Pattern)
工厂方法模式(Factory Method): 又称多态性工厂模式或虚拟构造子模式
抽象工厂模式(Abstract Factory): 又称工具箱模式(Kit或ToolKit)
简单工厂模式
简单工厂模式,或称静态工厂方法模式,是不同的工厂方法的一个特殊实现。
简单工厂模式,或称静态工厂方法模式,是不同的工厂方法的一个特殊实现。比如有一个农场公司,专门向市场销售各类水果,我们会真么描述这个系统:
1 2 3 4 5 6 7 8 9 10 11 12
| public interface Fruit { void grow(); void harvest(); void plant(); }
|
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
| public class Apple implements Fruit { private int treeAge; public int setTreeAge(int treeAge) { this.treeAge = treeAge; } public int getTreeAge() { return this.treeAge; } * 生长 */ public void grow() { System.out.println("Apple is growing..."); } * 种植 */ public void harvest() { System.out.println("Apple is harvest."); } * 收获 */ public void plant() { System.out.println("Apple has ben planted."); } }
|
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
| public class Grape implements Fruit { private boolean seedless; public int setSeedless(boolean seedless) { this.seedless = seedless; } public int getTreeAge() { return this.seedless; } * 生长 */ public void grow() { System.out.println("Grape is growing..."); } * 种植 */ public void harvest() { System.out.println("Grape is harvest."); } * 收获 */ public void plant() { System.out.println("Grape has ben planted."); } }
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20
| public class FruitGardener { * 静态工厂方法 */ public static Fruit factory(String which) { switch(name) { case "apple": return new Apple(); break; case "grape": return new Grape(); break; default: return null; break; } } }
|
1 2
| FruitGardener.factory("apple"); FruitGardener.factory("grape");
|
总结:简单工厂模式涉及到工厂角色、抽象产品角色以及具体产品角色3个角色
- 工厂类(Creator)角色:担任这个角色的是工厂方法模式的核心,含有与应用紧密相关的逻辑。工厂类在客户端的直接调用下创建产品对象,它往往由一个具体java类实现。
- 抽象产品(Product)角色:担任这个角色的类是由工厂方法模式所创建的对象的父类,或它们有共同的接口。抽象产品角色可以由用一个java接口或java抽象类实现。
- 具体产品(Concrete Product)角色:工厂方法模式所创建的任何对象都是这个角色的实例,具体产品角色由一个具体Java类实现。