美文网首页
设计模式——工厂模式

设计模式——工厂模式

作者: 笑对浮华 | 来源:发表于2023-09-18 16:50 被阅读0次

    一、简单工厂模式

    1、原理

    创建一个工厂类,提供一个创建对象方法,根据传参判断返回哪一个产品,各种产品应属于同一类,实现或继承自同一个接口或抽象类。

    2、UML类图

    简单工厂

    3、示例代码

    public class SimplePizzaFactory {
    
        private static Pizza mPizza;
    
        public static Pizza createPizza(String type){
            switch (type){
                case "cheese":
                    mPizza = new CheesePizza();
                    break;
                case "greak":
                    mPizza = new GreakPizza();
                    break;
            }
            mPizza.make();
            return mPizza;
        }
    }
    

    4、特点

    • 外部调用相关方法,根据不同类别返回不同实例,外部调用者不需要去做区分,降低了客户端和创建过程中其他类的耦合,符合迪米特原则
    • 工厂类违反开闭原则,当系统需要拓展第三种口味的Pizza时,需要对工厂类做出修改,随着项目拓展,工厂类变得臃肿,不便于后期维护。

    二、工厂方法模式

    1、原理

    因为简单工厂模式中违反了开闭原则,所以工厂方法模式中对工厂类进行抽象化,不同工厂子类生产对应的产品,当系统拓展的时候新增相应的产品工厂,不需要再去对已有的工厂类进行修改,使系统满足了开闭原则。

    2、UML类图

    工厂方法

    3、示例代码

    public class CheesePizzaFactory extends PizzaFactory{
    
        @Override
        protected Pizza createPizza() {
            CheesePizza pizza = new CheesePizza();
            pizza.bake();
            pizza.cut();
            pizza.box();
            return pizza;
        }
    }
    
    public class GreakPizzaFactory extends PizzaFactory{
    
        @Override
        protected Pizza createPizza() {
            GreakPizza pizza = new GreakPizza();
            pizza.bake();
            pizza.cut();
            pizza.box();
            return pizza;
        }
    }
    

    4、特点

    • 将简单工厂模式中工厂类抽象化,定义一个抽象工厂基类,工厂子类具体实现产品对象的创建细节,当有新的产品需要创建时,新建其对应的工厂类即可。
    • 每个工厂子类只能生产一种产品,当产品过多时,工厂类也会增多,且工厂类实现都差不多,系统复杂度也上升。

    三、抽象工厂模式

    1、原理

    为解决工厂方法模式中一个工厂类只能生产一种产品导致的类数量增多,系统复杂度提升问题,抽象工厂模式是一个工厂类可以生产多种产品。

    2、UML类图

    抽象工厂

    3、代码实例

    public class BJPizzaFactory extends AbstractPizzaFactory{
    
        @Override
        protected AbstractPizza createCheesePizza() {
            BJCheesePizza cheesePizza = new BJCheesePizza();
            cheesePizza.bake();
            cheesePizza.cut();
            cheesePizza.box();
            return cheesePizza;
        }
    
        @Override
        protected AbstractPizza createGreakPizza() {
            BJGreakPizza cheesePizza = new BJGreakPizza();
            cheesePizza.bake();
            cheesePizza.cut();
            cheesePizza.box();
            return cheesePizza;
        }
    }
    
    public class SHPizzaFactory extends AbstractPizzaFactory{
    
        @Override
        protected AbstractPizza createCheesePizza() {
            SHCheesePizza cheesePizza = new SHCheesePizza();
            cheesePizza.bake();
            cheesePizza.cut();
            cheesePizza.box();
            return cheesePizza;
        }
    
        @Override
        protected AbstractPizza createGreakPizza() {
            SHGreakPizza cheesePizza = new SHGreakPizza();
            cheesePizza.bake();
            cheesePizza.cut();
            cheesePizza.box();
            return cheesePizza;
        }
    }
    

    4、特点

    一个工厂子类可以生产多种同类商品,系统在工厂级别上能很好的拓展,新建工厂子类继承基类即可,但当在产品级别上需要拓展时,需要去更改整个系统,包括基类中定义相关的创建方法返回新的产品类型对象,此时来看,不符合开闭原则,所以当一个系统中产品比较稳定的时候用这种方法比较好。

    总结

    简单工厂模式->工厂方法模式->抽象工厂模式依次改进得到,为了解决简单工厂模式中工厂类违反开闭原则的问题,工厂方法模式抽象化工厂类,使得不同的产品由不同的工厂类生产,这样当系统需要拓展新的产品时新建相关的工厂类即可,但解决了开闭原则问题的同时又衍生出新的问题,工厂方法模式中每个工厂类只能生产一种产品,当系统中产品很多时,工厂类也相应增加,系统复杂度提升,为了解决这一问题,抽象工厂模式通过一个工厂类生产多种产品的模式去实现,这样要求在定义工厂基类时就需要定义好创建相关产品的方法,即工厂能生产哪些产品在一开始就定义好了,工厂子类只是去实现具体细节,这样导致了在工厂层面上能够很好拓展,在产品层面上还是违反了开闭原则,新的产品来临时,需要在基类中去定义创建产品的方法,从上到下整个系统都得修改,所以对产品层面的拓展不友好,一般当系统产品稳定的情况推荐使用抽象工厂模式。

    相关文章

      网友评论

          本文标题:设计模式——工厂模式

          本文链接:https://www.haomeiwen.com/subject/vtrwvdtx.html