抽象工厂模式

来源:互联网 发布:五子棋人工智能算法 编辑:程序博客网 时间:2024/05/16 01:18

抽象工厂模式属于创建型模式

意图:提供一个创建一系列相关或相互依赖对象的接口,而无需指定它们具体的类。

主要解决:主要解决接口选择的问题。

何时使用:系统的产品有多于一个的产品族,而系统只消费其中某一族的产品。

优点:当一个产品族中的多个对象被设计成一起工作时,它能保证客户端始终只使用同一个产品族中的对象。

缺点:产品族扩展非常困难,要增加一个系列的某一产品,既要在抽象的Creator里加代码,又要在具体的里面加代码。

UML图如下:



// 抽象食物interface Food {    public String getFoodName();}// 抽象餐具interface TableWare {    public String getToolName();}// 抽象工厂interface KitchenFactory {    public Food getFood();    public TableWare getTableWare();}//具体食物 Apple 的定义如下class Apple implements Food{    public String getFoodName() {        return "apple";    }}//具体餐具 Knife 的定义如下class Knife implements TableWare {     public String getToolName() {        return "knife";    }}// 以具体工厂 AKitchen 为例class AKitchen implements KitchenFactory {    public Food getFood() {       return new Apple();    }    public TableWare getTableWare() {       return new Knife();    }}// 客户public class Customer {    public void eat(KitchenFactory k) {       System.out.println("A foodaholic is eating "+ k.getFood().getFoodName()              + " with " + k.getTableWare().getToolName() );    }    public static void main(String[] args) {       Customer c = new Customer();       KitchenFactory kf = new AKitchen();       c.eat(kf);    }}


工厂方法模式、抽象工厂模式区别:

首先先看两个概念:
    产品等级结构:比如一个抽象类是食物,其子类有苹果、牛奶等等,则抽象食物与具体食物名称之间构成了一个产品等级结构。食物是抽象的父类,而具体的食物名称是其子类。
    产品族:在抽象工厂模式中,产品族是指由同一个工厂生产的,位于不同产品等级结构中的一组产品。如 AKitchen 生产的苹果、刀子,苹果属于食物产品等级结构中,而刀子则属于餐具产品等级结构中。而 BKitchen 可能生成另一组产品,如牛奶、杯子。
因此工厂方法模式、抽象工厂模式最大的区别在于:
工厂方法模式:针对的是一个产品等级结构。
抽象工厂模式:针对多个产品等级结构。


1 0