工厂设计模式 - 详解

介绍

工厂模式是Java中最常用的设计模式之一,这种类型的设计模式数据创建型模式

主要就是负责创建对象的,当我们使用new创建对象的时候会导致对该对象的耦合性很严重,当我们需要修改的时候需要对所有new的对象进行修改,违反了软件设计的开闭原则,当我们使用工厂来生产对象的时候,我们只需要和工厂打交道就可以了。

简单工厂模式

简单工厂都有哪几个角色:

  1. 抽象产品(Car)
  2. 具体产品(WuLingCar,DaZhongCar)
  3. 具体工厂(CarFactory )
  4. 产品使用者(SimplenessFactory )

使用时通过调用工厂的 getCar() 方法,传入指定参数返回对应对象

package factory;

public class SimplenessFactory {
    public static void main(String[] args) {
        Car wuling = CarFactory.getCar("wuling");
        wuling.wheel();
        Car dazhong = CarFactory.getCar("dazhong");
        dazhong.wheel();
    }
}

interface Car {
    void wheel();
}

class WuLingCar implements Car {
    @Override
    public void wheel() {
        System.out.println("五菱车装轮子");
    }
}

class DaZhongCar implements Car {
    @Override
    public void wheel() {
        System.out.println("大众车装轮子");
    }
}

class CarFactory {
    public static Car getCar(String name) {
        if (name == null) {
            return null;
        }
        if (name.equals("dazhong")) {
            return new DaZhongCar();
        } else if (name.equals("wuling")) {
            return new WuLingCar();
        }
        return null;
    }
}

 就这样一个简单工厂就创建好了,但是这种方式创建的工厂是违反了开闭原则的,试想当我们需要新增一种车型的时候,是不是需要修改之前的代码?是的!

工厂方法模式

工厂方法模式都有哪几个角色:

  1. 抽象产品(Car)
  2. 具体产品(WuLingCar,DaZhongCar)
  3. 抽象工厂(CarFactory )
  4. 具体工厂(WuLingFactory,DaZhongFactory)
  5. 产品使用者(SimplenessFactory )

将工厂进行一层抽象,具体生产什么产品由子类决定。

和上面例子差不多,只不过这一层多了一层对工厂的抽象。

package factory;

public class SimplenessFactory {
    public static void main(String[] args) {
        Car wuling = new WuLingFactory().getCar();
        Car dazhong = new DaZhongFactory().getCar();
        wuling.wheel();
        dazhong.wheel();
    }
}

interface Car {
    void wheel();
}

class WuLingCar implements Car {
    @Override
    public void wheel() {
        System.out.println("五菱车装轮子");
    }
}

class DaZhongCar implements Car {
    @Override
    public void wheel() {
        System.out.println("大众车装轮子");
    }
}

interface CarFactory {
    Car getCar();
}

class WuLingFactory implements CarFactory {
    @Override
    public Car getCar() {
        return new WuLingCar();
    }
}

class DaZhongFactory implements CarFactory {
    @Override
    public Car getCar() {
        return new DaZhongCar();
    }
}

工厂方法模式无疑满足了开闭原则,当需要进行扩展的时候只需要继承实现抽象工厂类和抽象产品类,就可以进行使用了。

结论

无论是结构复杂度,代码复杂度,编程复杂度,管理复杂度,简单工厂无疑是优于工厂方法模式的。

虽然说我们根据设计原则我们应该选择工厂方法模式,但是实际业务中更多的时候使用的是简单工厂模式,因为工厂方法模式从各方面来讲复杂度要高于简单工厂模式。所以有时候并不非要满足所有原则,如果为了一个原则把一段程序设计的极其复杂,也是不好的。

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

鹈鹕吃吃吃

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值