定义:
- 定义一个创建产品对象的工厂接口,将产品对象的实际创建工作推迟到具体子工厂类当中。
特点:
- 用户只需要知道具体工厂的名称就可得到所要的产品,无须知道产品的具体创建过程;(优点)
- 在系统增加新的产品时只需要添加具体产品类和对应的具体工厂类,无须对原工厂进行任何修改,满足开闭原则;(优点)
- 每增加一个产品就要增加一个具体产品类和一个对应的具体工厂类,这增加了系统的复杂度。(缺点)
通常适用场景:
- 客户只知道创建产品的工厂名,而不知道具体的产品名。
- 创建对象的任务由多个具体子工厂中的某一个完成,而抽象工厂只提供创建产品的接口。
- 客户不关心创建产品的细节,只关心产品的品牌。
demo代码:
- 抽象产品和具体产品 ```java public interface Fruit{ void eat(); }
public class Peach implements Fruit{ @Override public void eat() { System.out.println(“peach”); } }
public class Pear implements Fruit{ @Override public void eat() { System.out.println(“pear”); } }
- 抽象工厂和具体工厂```javapublic interface FruitFactory {Fruit make(String name);}public class HubeiFruitFactory implements FruitFactory {@Overridepublic Fruit make(String name) {if (name.equals("peach")) {return new Peach();} else if (name.equals("pear")) {return new Pear();} else {return null;}}}public class GuangZhouFruitFactory implements FruitFactory {@Overridepublic Fruit make(String name) {if (name.equals("peach")) {return new Peach();} else if (name.equals("pear")) {return new Pear();} else {return null;}}}
- 测试
public static void main(String[] args) { FruitFactory factory = new HubeiFruitFactory(); //选择一个工厂 Fruit fruit = factory.make("peach");//不同的工厂造出不一样的对象 }
