定义
定义一个用于创建对象的接口,让子类决定实例化那个类
UML类图
解读:
- Product: 产品抽象类,
- ConcreteProduct: 产品实现类
- Creator: 工厂抽象类, 返回一个Product实例
- ConcreteCreator: 工厂实现类, 返回一个ConcreteProduct实例
简单实现
## Fruit: 作为产品抽象类
1 2 3
| public abstract class Fruit { abstract void getName(); }
|
## Banana: 作为产品实现类
1 2 3 4 5 6
| public class Banana extends Fruit { @Override void getName() { System.out.println("I am banana"); } }
|
Apple: 作为产品实现类
1 2 3 4 5 6
| public class Apple extends Fruit { @Override void getName() { System.out.println("I am apple"); } }
|
FruitFactory: 作为抽象工厂类
1 2 3
| public abstract class FruitFactory { abstract Fruit createFruit(); }
|
AppleFactory: 作为工厂实现类
1 2 3 4 5 6
| public class AppleFactory extends FruitFactory { @Override Fruit createFruit() { return new Apple(); } }
|
BananaFactory: 作为工厂实现类
1 2 3 4 5 6
| public class BananaFactory extends FruitFactory { @Override Fruit createFruit() { return new Banana(); } }
|
使用
在需要哪一个产品时就生产哪个
1 2 3
| FruitFactory fruitFactory = new AppleFactory(); Fruit apple = fruitFactory.createFruit(); apple.getName();
|
使用反射
FruitFactory
1 2 3
| public abstract class FruitFactory { abstract <T extends Fruit> T createFruit(Class<T> className); }
|
### ConcreteFruitFactory: 具体工厂类
1 2 3 4 5 6 7 8 9 10 11 12
| public class ConcreteFruitFactory extends FruitFactory { @Override <T extends Fruit> T createFruit(Class<T> className) { Fruit fruit = null; try { fruit = (Fruit)Class.forName(className.getName()).newInstance(); }catch (Exception e){ e.printStackTrace(); } return (T)fruit; } }
|
使用
需要哪个类对象就传入那个类的类型
1 2 3
| FruitFactory fruitFactory = new ConcreteFruitFactory(); Fruit apple = fruitFactory.createFruit(Apple.class); apple.getName();
|
简单工厂方法模式
当工厂只有一个的时候, 只需将对应的工厂方法改为静态方法, 并去掉abstract关键字, 此时就变成了简单工厂模式或者静态工厂模式
1 2 3 4 5
| public class FruitFactory { static Fruit createFruit(){ return new Apple(); } }
|