工厂模式

一.工厂方法模式

1.简单工厂模式

基本介绍

就是建立一个工厂类,对实现了同一接口的一些类进行实例的创建。

代码实例

​ 准备一个pizza抽象类,抽象准备原材料的方法,有两个实现类分别是CheesePizza和GreekPizza。

pizza类准备

//抽象Pizza类,封装了抽象的准备原材料方法
public abstract class Pizza {
    protected String name;
    //准备原材料
    public abstract void prepare();
}
------------------------------------------------------------------------------
 //GreekPizza
public class GreekPizza extends Pizza{
    @Override
    public void prepare() {
        System.out.println("给制作Greek披萨准备材料");
    }
}
------------------------------------------------------------------------------
 //CheesePizza
public class CheesePizza  extends Pizza{
    @Override
    public void prepare() {
        System.out.println("给制作奶酪披萨准备材料");
    }
}

新建一个工厂类

public class SimpleFactory {
    public Pizza getPizza(String type){
        switch (type) {
            case "cheese":
                return new CheesePizza();
            case "greek":
                return new GreekPizza();
        }
        System.out.println("请输入正确的pizza种类");
        return null;
    }
}

结果演示:

class Test{
    public static void main(String[] args) {
        SimpleFactory simpleFactory = new SimpleFactory();
        simpleFactory.getPizza("cheese").prepare();
        simpleFactory.getPizza("greek").prepare();
        simpleFactory.getPizza("fdas");
    }
}
------------------------------------------------------------------------------
给制作奶酪披萨准备材料
给制作Greek披萨准备材料
请输入正确的pizza种类

2.多个工厂方法模式

基本介绍

​ 是对普通工厂方法模式的改进,在普通工厂方法模式中,如果传递的字符串出错,则不能正确创建对象,而多个工厂方法模式是提供多个工厂方法,分别创建对象

代码实例:

新建工厂类:

public class GetFactory {
    public Pizza getGreek() {
        return new GreekPizza();
    }
    public Pizza getCheese() {
        return new CheesePizza();
    }
}

结果演示:

class Test{
    public static void main(String[] args) {
        GetFactory getFactory = new GetFactory();
        getFactory.getCheese().prepare();
        getFactory.getGreek().prepare();
    }
}
------------------------------------------------------------------------------
给制作奶酪披萨准备材料
给制作Greek披萨准备材料

3.静态工厂方法模式

基本介绍

将上面的多个工厂方法模式里的方法置为静态的,不需要创建实例,直接调用即可。

代码实例

public class GetFactory {
    public static Pizza getGreek() {
        return new GreekPizza();
    }
    public static Pizza getCheese() {
        return new CheesePizza();
    }
}

结果演示

class Test{
    public static void main(String[] args) {
        GetFactory.getGreek().prepare();
        GetFactory.getGreek().prepare();
    }
}
------------------------------------------------------------------------------
给制作Greek披萨准备材料
给制作Greek披萨准备材料

总结

总体来说,工厂模式适合:凡是出现了大量的产品需要创建,并且具有共同的接口时,可以通过工厂方法模式进行创建。在以上的三种模式中,第一种如果传入的字符串有误,不能正确创建对象,第三种相对于第二种,不需要实例化工厂类,所以,大多数情况下,我们会选用第三种——静态工厂方法模式。

二.抽象工厂模式

基本介绍

​ 工厂方法模式有一个问题就是,类的创建依赖工厂类,也就是说,如果想要拓展程序,必须对工厂类进行修改,这违背了闭包原则,所以,从设计角度考虑,有一定的问题,如何解决?就用到抽象工厂模式,创建多个工厂类,这样一旦需要增加新的功能,直接增加新的工厂类就可以了,不需要修改之前的代码。

代码实例:

抽象工厂

public interface AbstractFactory {
    public Pizza getPizza();
}

工厂类:

public class CheesePizzaFactory implements AbstractFactory {
    @Override
    public Pizza getPizza() {
        return  new CheesePizza();
    }
}
------------------------------------------------------------------------------
public class GreekPizzaFactory implements AbstractFactory {
    @Override
    public Pizza getPizza() {
        return  new GreekPizza();
    }
}

测试:

class Test{
    public static void main(String[] args) {
        new GreekPizzaFactory().getPizza().prepare();
        new CheesePizzaFactory().getPizza().prepare();
    }
}
------------------------------------------------------------------------------
给制作Greek披萨准备材料
给制作奶酪披萨准备材料

好处

​ 如果有需要扩充时,只需要新建一个pizza的实现类,新建其对应的工厂类,工厂类实现抽象工厂就可以完成扩充,无需在已有的代码上进行改进。扩展性好

posted @ 2022-09-29 16:58  与否业务NOW  阅读(35)  评论(0)    收藏  举报