创建型设计模式——抽象工厂模式

简介: 创建型设计模式——抽象工厂模式

1.什么是抽象工厂模式


1.    抽象工厂模式:  定义了一个interface用于创建相关或有依赖关系的对象簇,而无需指明具体的类。

2.    抽象工厂模式可以将简单工厂模式和工厂方法模式进行整合。

3.    从设计层面看,抽象工厂模式就是对简单工厂模式的改进(或者称为进一步的抽象)

4.    将工厂抽象成两层,AbsFactory(抽象工厂))和具体实现的工厂子类。程序员可以根据创建对象类型使用对应的工厂子类。这样将单个的简单工厂类变成了工厂簇,更利于代码的维护和扩展。

我们仍然以上一篇文章的案例为主,画出抽象工厂模式下的类图

2.案例代码


首先仍然是Pizza种类相关的几个类。

package com.szh.factory.abstractfactory.pizza;
/**
 * 声明Pizza类为抽象类
 */
public abstract class Pizza {
    //Pizza名称
    protected String name;
    //准备原材料,不同的披萨不一样。因此,我们做成抽象方法,具体的原材料实现交给它的子类去完成
    public abstract void prepare();
    //烘烤
    public void bake() {
        System.out.println(name + " baking;");
    }
    //切割
    public void cut() {
        System.out.println(name + " cutting;");
    }
    //打包
    public void box() {
        System.out.println(name + " boxing;");
    }
    public void setName(String name) {
        this.name = name;
    }
}
package com.szh.factory.abstractfactory.pizza;
public class LDPepperPizza extends Pizza {
  @Override
  public void prepare() {
    setName("伦敦的胡椒pizza");
    System.out.println("伦敦的胡椒pizza 准备原材料");
  }
}
package com.szh.factory.abstractfactory.pizza;
public class LDCheesePizza extends Pizza {
  @Override
  public void prepare() {
    setName("伦敦的奶酪pizza");
    System.out.println("伦敦的奶酪pizza 准备原材料");
  }
}
package com.szh.factory.abstractfactory.pizza;
public class BJPepperPizza extends Pizza {
  @Override
  public void prepare() {
    setName("北京的胡椒pizza");
    System.out.println("北京的胡椒pizza 准备原材料");
  }
}
package com.szh.factory.abstractfactory.pizza;
public class BJCheesePizza extends Pizza {
  @Override
  public void prepare() {
    setName("北京的奶酪pizza");
    System.out.println("北京的奶酪pizza 准备原材料");
  }
}

下面是抽象工厂和工厂方法的区别之处。

package com.szh.factory.abstractfactory.order;
import com.szh.factory.abstractfactory.pizza.Pizza;
//一个抽象工厂模式的抽象层(接口)
public interface AbsFactory {
    //让下面的工厂子类来具体实现
    public Pizza createPizza(String orderType);
}
package com.szh.abstractfactory.order;
import com.szh.abstractfactory.pizza.BJCheesePizza;
import com.szh.abstractfactory.pizza.BJPepperPizza;
import com.szh.abstractfactory.pizza.Pizza;
public class BJFactory implements AbsFactory {
    @Override
    public Pizza createPizza(String orderType) {
        Pizza pizza = null;
        if("cheese".equals(orderType)) {
            pizza = new BJCheesePizza();
        } else if ("pepper".equals(orderType)){
            pizza = new BJPepperPizza();
        }
        return pizza;
    }
}
package com.szh.abstractfactory.order;
import com.szh.abstractfactory.pizza.LDCheesePizza;
import com.szh.abstractfactory.pizza.LDPepperPizza;
import com.szh.abstractfactory.pizza.Pizza;
public class LDFactory implements AbsFactory {
    @Override
    public Pizza createPizza(String orderType) {
        Pizza pizza = null;
        if ("cheese".equals(orderType)) {
            pizza = new LDCheesePizza();
        } else if ("pepper".equals(orderType)) {
            pizza = new LDPepperPizza();
        }
        return pizza;
    }
}
package com.szh.factory.abstractfactory.order;
import com.szh.factory.abstractfactory.pizza.Pizza;
import java.util.Scanner;
public class OrderPizza {
    AbsFactory absFactory;
    public OrderPizza(AbsFactory absFactory) {
        setFactory(absFactory);
    }
    private void setFactory(AbsFactory absFactory) {
        Pizza pizza = null;
        String orderType = ""; // 用户输入
        this.absFactory = absFactory;
        do {
            orderType = getType();
            // factory 可能是北京的工厂子类,也可能是伦敦的工厂子类
            pizza = absFactory.createPizza(orderType);
            if (pizza != null) { // 订购ok
                pizza.prepare();
                pizza.bake();
                pizza.cut();
                pizza.box();
            } else {
                System.out.println("订购失败");
                break;
            }
        } while (true);
    }
    // 写一个方法,可以获取客户希望订购的披萨种类
    private String getType() {
        Scanner scanner = new Scanner(System.in);
        System.out.println("请输入 pizza 种类: ");
        String str = scanner.nextLine();
        return str;
    }
}

最后是测试类。

package com.szh.abstractfactory;
import com.szh.abstractfactory.order.BJFactory;
import com.szh.abstractfactory.order.LDFactory;
import com.szh.abstractfactory.order.OrderPizza;
import java.util.Scanner;
public class MainTest {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        String content = scanner.next();
        if ("Beijing".equals(content)) {
            new OrderPizza(new BJFactory());
        } else if ("London".equals(content)) {
            new OrderPizza(new LDFactory());
        } else {
            System.out.println("无法预先匹配Pizza种类....");
            scanner.close();
        }
    }
}


3.工厂方法 + 抽象工厂总结


1.    工厂模式的意义:将实例化对象的代码提取出来,放到一个类中统一管理和维护,达到和主项目的依赖关系的解耦。从而提高项目的扩展和维护性。


2.    遵循了依赖倒转原则:创建对象实例时,不要直接new类,而是把这个new类的动作放在一个工厂的方法中,并返回。有的书上说,变量不要直接持有具体类的引用。   不要让类继承具体类,而是继承抽象类或者是实现interface(接口)不要覆盖基类中已经实现的方法。

相关文章
|
5月前
|
设计模式 Java
Java设计模式【三】:抽象工厂模式
Java设计模式【三】:抽象工厂模式
21 0
|
20天前
|
设计模式 Java
【设计模式系列笔记】抽象工厂模式
抽象工厂模式(Abstract Factory Pattern)是一种设计模式,属于创建型模式之一。它提供了一种方式来创建一系列相关或相互依赖的对象,而无需指定它们具体的类。抽象工厂模式通过引入抽象的工厂接口,使得客户端代码可以使用抽象的接口来创建一组相关的产品,而不关心这些产品的具体实现。
110 4
|
16天前
|
设计模式 存储 JavaScript
[设计模式Java实现附plantuml源码~创建型] 多态工厂的实现——工厂方法模式
[设计模式Java实现附plantuml源码~创建型] 多态工厂的实现——工厂方法模式
|
17天前
|
设计模式 Java Go
[设计模式Java实现附plantuml源码~创建型] 集中式工厂的实现~简单工厂模式
[设计模式Java实现附plantuml源码~创建型] 集中式工厂的实现~简单工厂模式
|
1月前
|
设计模式 Java Windows
23种设计模式,抽象工厂模式的概念优缺点以及JAVA代码举例
【4月更文挑战第10天】抽象工厂模式是一种创建型设计模式,它提供了一个接口用于创建相关或依赖对象的家族,而不需要指定具体类。该模式允许客户端在不知道具体类的情况下,通过其共同的接口来创建一组产品。
30 7
|
4月前
|
设计模式 安全 数据库
创建型设计模式-单例模式/工厂模式/抽象工厂
创建型设计模式-单例模式/工厂模式/抽象工厂
38 0
|
4月前
|
设计模式 算法
1.2.1 创建型设计模式
1.2.1 创建型设计模式
|
4月前
|
设计模式 Oracle 关系型数据库
设计模式 | 抽象工厂模式
设计模式 | 抽象工厂模式
25 0
|
4月前
|
设计模式 Go 开发工具
Golang设计模式——02抽象工厂模式
Golang设计模式——02抽象工厂模式
23 0
|
4月前
|
设计模式 算法 C++
c++设计模式详解_创建型设计模式
c++设计模式详解_创建型设计模式