Java的三种工厂模式

场景:

一家饭店菜单上有两种饭,分别是黄焖鸡米饭和河北正宗安徽牛肉板面,顾客点餐我们要做出顾客选的那种饭

首先肯定是有一个接口Cook,cook方法表示做饭

public interface Cook {
    void cook();
}

创建两个类来实现Cook接口

public class CookMi implements Cook{
    @Override
    public void cook() {
        System.out.println("黄焖鸡米饭");
    }
}
public class CookMian implements Cook{
    @Override
    public void cook() {
        System.out.println("河北正宗安徽牛肉板面");
    }
}

不使用工厂模式:

直接通过new对象的方式,调用cook方法

public class Test {
    public static void main(String[] args) {
        Cook cook;
        System.out.println("请输入你要点的餐:");
        Scanner scanner = new Scanner(System.in);
        String type = scanner.nextLine();
        if("mi".equals(type)){
            cook = new CookMi();
        }else if ("mian".equals(type)) {
            cook = new CookMian();
        }else{
            System.out.println("请输入正确的类型");
            cook = null;
        }
        if(cook != null){
            cook.cook();
        }
    }
}

在这里插入图片描述

普通工厂模式

创建工厂类CookFactory,将判断语句放到这里,return Cook对象

public class CookFactory{
    public Cook cookCreate(String type){
        if("mi".equals(type)){
            return new CookMi();
        }else if("mian".equals(type)){
            return new CookMian();
        }else{
            System.out.println("请输入正确的类型");
            return null;
        }
    }
}

在测试类Test中new工厂对象,调用cookCreate方法来创建对象

public class Test {
    public static void main(String[] args) {
        Cook cook;
        CookFactory cookFactory = new CookFactory();
        cook = cookFactory.cookCreate("mi");
        if(cook != null){
            cook.cook();
        }
    }
}

在这里插入图片描述

多个工厂方法模式

在普通工厂模式中,我们发现可能会出现点的餐在菜单上不存在的情况,这时我们可以把做饭方法分为两个,做米饭和做面条

public class CookFactory{
    public Cook cookMiCreate(){
        return new CookMi();
    }
    public Cook cookMianCreate(){
        return new CookMian();
    }
}

测试类Test只需要调用对应的方法,不用参数就可以创建Cook对象

public class Test {
    public static void main(String[] args) {
        Cook cook;
        CookFactory cookFactory = new CookFactory();
        cook = cookFactory.cookMianCreate();
        if(cook != null){
            cook.cook();
        }
    }
}

在这里插入图片描述

静态工厂模式

在普通工厂模式或者多个工厂模式的基础上把create方法设置为静态方法即可

public class CookFactory{
    public static Cook cookMiCreate(){
        return new CookMi();
    }
    public static Cook cookMianCreate(){
        return new CookMian();
    }
}

在测试类Test中不需要创建工厂对象,直接调用方法即可

public class Test {
    public static void main(String[] args) {
        Cook cook;
        cook = CookFactory.cookMiCreate();
        if(cook != null){
            cook.cook();
        }
    }
}

在这里插入图片描述

抽象工厂模式

前面几种模式都有一个问题,就是如果想要拓展程序,就是在菜单上加菜,必须修改工厂类,违背了闭包原则,我们可以使用抽象工厂模式,创建多个工厂类,一旦想要进行拓展,只需要添加新的工厂即可,不需要修改之前的代码

创建一个接口CookCreate,此后每个工厂类都要实现这个接口

public interface CookCreate {
    Cook cookCreate();
}

两个工厂,分别为做米饭和做面条

public class CookMiFactory implements CookCreate{
    @Override
    public Cook cookCreate() {
        return new CookMi();
    }
}
public class CookMianFactory implements CookCreate{
    @Override
    public Cook cookCreate() {
        return new CookMian();
    }
}

在测试类Test中,new出对应工厂,调用接口方法即可创建对象

public class Test {
    public static void main(String[] args) {
        Cook cook;
        CookCreate create = new CookMianFactory();
        cook = create.cookCreate();
        cook.cook();
    }
}

在这里插入图片描述
如果想要在菜单上加菜,只需要创建一个做饭类实现Cook接口,再创建一个工厂并实现CookCreate接口即可

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
好的,我来介绍一下Java中的三种工厂模式: 1. 简单工厂模式(Simple Factory Pattern) 简单工厂模式是一种创建型设计模式,它提供了一个创建对象的最佳方式。在简单工厂模式中,我们创建对象而无需暴露创建逻辑给客户端,我们将创建对象的逻辑封装在一个工厂类中。 示例代码: ``` public class SimpleFactory { public static Product createProduct(String type) { if ("A".equals(type)) { return new ConcreteProductA(); } else if ("B".equals(type)) { return new ConcreteProductB(); } else { return null; } } } ``` 2. 工厂方法模式(Factory Method Pattern) 工厂方法模式是一种创建型设计模式,它定义了一个用于创建对象的接口,但由子类决定要实例化的类是哪一个。工厂方法让类把实例化推迟到子类。 示例代码: ``` public abstract class Factory { public abstract Product createProduct(); } public class ConcreteFactoryA extends Factory { @Override public Product createProduct() { return new ConcreteProductA(); } } public class ConcreteFactoryB extends Factory { @Override public Product createProduct() { return new ConcreteProductB(); } } ``` 3. 抽象工厂模式(Abstract Factory Pattern) 抽象工厂模式是一种创建型设计模式,它允许客户端使用抽象接口来创建一组相关的产品,而不需要知道或关心实际生产出的具体产品是什么。它是工厂方法模式的扩展,它支持多个产品族的创建。 示例代码: ``` public interface AbstractFactory { public AbstractProductA createProductA(); public AbstractProductB createProductB(); } public class ConcreteFactory1 implements AbstractFactory { @Override public AbstractProductA createProductA() { return new ProductA1(); } @Override public AbstractProductB createProductB() { return new ProductB1(); } } public class ConcreteFactory2 implements AbstractFactory { @Override public AbstractProductA createProductA() { return new ProductA2(); } @Override public AbstractProductB createProductB() { return new ProductB2(); } } ``` 以上是Java中的三种工厂模式,希望对你有帮助。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值