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接口即可


版权声明:本文为weixin_46116099原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。