设计模式(三)——Java工厂方法模式

 工厂方法模式

1 看一个新的需求

披萨项目新的需求:客户在点披萨时,可以点不同口味的披萨,比如 北京的奶酪 pizza、北京的胡椒 pizza 或者是伦敦的奶酪 pizza、伦敦的胡椒 pizza。

思路 1

使用简单工厂模式,创建不同的简单工厂类,比如 BJPizzaSimpleFactory、LDPizzaSimpleFactory 等等.从当前这个案例来说,也是可以的,但是考虑到项目的规模,以及软件的可维护性、可扩展性并不是特别好

思路 2

使用工厂方法模式

4 工厂方法模式介绍

1) 工厂方法模式设计方案:将披萨项目的实例化功能抽象成抽象方法,在不同的口味点餐子类中具体实现。

2) 工厂方法模式:定义了一个创建对象的抽象方法,由子类决定要实例化的类。工厂方法模式将对象的实例化推迟到子类。

5 工厂方法模式应用案例

1) 披萨项目新的需求:客户在点披萨时,可以点不同口味的披萨,比如 北京的奶酪 pizza、北京的胡椒 pizza 或者是伦敦的奶酪 pizza、伦敦的胡椒 pizza

2) 思路分析图解

Pizza类

复制代码
package com.lin.factorymethod;


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{
    
}
复制代码

OrderPizza

复制代码
package com.lin.factorymethod;

import java.util.Scanner;

public abstract class OrderPizza {
    
    public OrderPizza(){
        Pizza pizza = null;
        String orderType;
        while(true) {
            orderType = getType();
            pizza = createPizza(orderType); 
            if( pizza != null) {
                pizza.prepare();
                pizza.bake();
                pizza.cut();
                pizza.box();
            } else {
                System.out.println("没有这种类型!");
            }
            
        }
    }
    
    // 定义一个抽象方法,createPizza,让各个工厂子类去实现
    public abstract Pizza createPizza(String orderType);
        

    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;
    }
}

class BJOrderPizza extends OrderPizza {

    @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 LNOrderPizza extends OrderPizza {

    @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;
    }
    
}
复制代码

PizzaStore类

复制代码
package com.lin.factorymethod;

import java.util.Scanner;

public class PizzaStore {

    public static void main(String[] args) {
        System.out.println("请输入地名:");
        Scanner scanner = new Scanner(System.in);
        String place = "";

        place = scanner.next();
        if(place.equals("伦敦")) {
            new LNOrderPizza();
        } else if(place.equals("北京")) {
            new BJOrderPizza();
        } else {
            System.out.println("该地域暂时没有开通功能!");
        }
    }
    

}
复制代码

 

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

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

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