设计模式(四)——Java抽象工厂模式

抽象工厂模式

 

1 基本介绍

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

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

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

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

5) 类图

 

 

 

2 抽象工厂模式应用实例

  使用抽象工厂模式来完成披萨项目

Pizza类

 

复制代码
package com.lin.abstractfactory;


abstract class Pizza{
    
    private String name;

    public void setName(String name) {
        this.name = name;
    }

    public void prepare() {
        System.out.println(name + " are prepared!");
    }
    
    public void bake() {
        System.out.println(name + " are baked!");
    }
    
    public void cut() {
        System.out.println(name + " are cutted!");
    }
    
    public void box() {
        System.out.println(name + " are boxed!");
    }
    
}

// 北京chesspizza
class BJChessPizza extends Pizza{

}

// 北京greekpizza
class BJGreekPizza extends Pizza{
    
}

//伦敦chesspizza
class LNChessPizza extends Pizza{

}

//伦敦greekpizza
class LNGreekPizza extends Pizza{
    
}
复制代码

 

AbstractFactory类

复制代码
package com.lin.abstractfactory;

interface AbstarctFactory {

    public  abstract Pizza createPizza(String orderType);
    
}

class BJFactory implements AbstarctFactory{

    @Override
    public Pizza createPizza(String orderType) {
        Pizza pizza = null;
        if(orderType.equals("cheese")) {
            pizza = new BJChessPizza();
            pizza.setName("北京Cheese");
        } else if(orderType.equals("greek")) {
            pizza = new BJGreekPizza();
            pizza.setName("北京Greek");
        }
        return pizza;
    }
    
}

class LNFactory implements AbstarctFactory{

    @Override
    public Pizza createPizza(String orderType) {
        Pizza pizza = null;
        if(orderType.equals("cheese")) {
            pizza = new LNChessPizza();
            pizza.setName("伦敦Cheese");
        } else if(orderType.equals("greek")) {
            pizza = new LNGreekPizza();
            pizza.setName("伦敦Greek");
        }
        return pizza;
    }
    
}
复制代码

OrderPizza类

复制代码
package com.lin.abstractfactory;

import java.util.Scanner;

public class OrderPizza {

    AbstarctFactory factory;

    public OrderPizza(AbstarctFactory factory) {
        setAbsFactory(factory);
    }
    
    public void setAbsFactory(AbstarctFactory factory) {
        Pizza pizza = null;
        String orderType = "";
        this.factory = factory;
        while(true) {
            orderType = getType();
            pizza = factory.createPizza(orderType);
            if( pizza != null) {
                pizza.prepare();
                pizza.bake();
                pizza.cut();
                pizza.box();
            } else {
                System.out.println("没有这种类型!");
            }
        }
    }
    
    public String getType() {
        Scanner str = new Scanner(System.in);
        System.out.println("please input the type of ordered pizza:");
        String type = str.next();
        return type;
    }
}
复制代码

PizzaStore类

复制代码
package com.lin.abstractfactory;

public class PizzaStore {

    public static void main(String[] args) {
//        new OrderPizza(new BJFactory());
        new OrderPizza(new LNFactory());
    }
}
复制代码

 

仅供参考,有错误还请指出!

有什么想法,评论区留言,互相指教指教。

 

posted @   linzm14  阅读(92)  评论(0编辑  收藏  举报
编辑推荐:
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
阅读排行:
· 周边上新:园子的第一款马克杯温暖上架
· 分享 3 个 .NET 开源的文件压缩处理库,助力快速实现文件压缩解压功能!
· Ollama——大语言模型本地部署的极速利器
· DeepSeek如何颠覆传统软件测试?测试工程师会被淘汰吗?
· 使用C#创建一个MCP客户端
点击右上角即可分享
微信分享提示