工厂方法模式

本文深入讲解了工厂方法模式,一种常用的软件设计模式。通过实例化对象的抽象方法,由子类决定实例化哪个类,实现了代码的灵活性和扩展性。以披萨项目为例,展示了如何根据不同需求动态创建不同类型的产品。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一、工厂方法模式介绍

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

二、工厂方法模式例子

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

       使用工厂方法模式来完成披萨项目新的需求,将披萨项目的实例化功能抽象成抽象方法,在不同的口味点餐子类中具体实现。类图如下所示:

代码如下所示:

1)创建Pizza类及其子类

public abstract class Pizza{
    private String name;
    
    public void setName(String name){
        this.name = name;
    }
 
    //准备原材料,不同的披萨所需的原材料不一样,因此做成抽象方法
    public abstract void prepare();
 
    public void bake(){
        System.out.println(name + " is backing...");
    }
 
    public void cut(){
        System.out.println(name + " is cutting...");
    }
 
    public void box(){
        System.out.println(name + " is boxing...");
    }
}
public class BJCheesePizza extends Pizza{

    public void prepare(){
        System.out.println("北京奶酪披萨准备原材料中...");
    }
}
public class BJPepperPizza extends Pizza{

    public void prepare(){
        System.out.println("北京胡椒披萨准备原材料中...");
    }
}
public class LDCheesePizza extends Pizza{

    public void prepare(){
        System.out.println("伦敦奶酪披萨准备原材料中...");
    }
}
public class LDPepperPizza extends Pizza{

    public void prepare(){
        System.out.println("伦敦胡椒披萨准备原材料中...");
    }
}

2)创建订购披萨类及其子类

//订购披萨类父类
public abstract class OrderPizza{
    //定义一个抽象方法,让各个工厂子类去实现
    public abstract Pizza createPizza(String type);

    public void orderPizza(){
        Pizza pizza = null;
        String type;
        do{
            type = getType();
            //抽象方法,由子类去实现
            pizza = createPizza(type);
            pizza.prepare();
            pizza.bake();
            pizza.cut();
            pizza.box();
        } while(true);
    }
 
    //获取客户希望订购的披萨种类
    private String getType(){
        try{
            BufferReader reader = new BufferReader(new InputStreamReader(System.in));
            System.out.print("input pizza type:");
            String type = reader.readLine();
            return type;
        } catch(IOException e){
            return "";
        }
    }
 
}
public class BJOrderPizza extends OrderPizza{

    public Pizza createPizza(String type){
        Pizza pizza = null;
        
        if("cheese".equals(type)){
            pizza = new BJCheesePizza();
        } else if("pepper".equals(type)){
            pizza = new BJPepperPizza();
        }
        return pizza;
    }
}
public class LDOrderPizza extends OrderPizza{

    public Pizza createPizza(String type){
        Pizza pizza = null;
        
        if("cheese".equals(type)){
            pizza = new LDCheesePizza();
        } else if("pepper".equals(type)){
            pizza = new LDPepperPizza();
        }
        return pizza;
    }
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值