工厂模式

本文详细介绍了工厂模式的两种主要形式——简单工厂模式和工厂方法模式。简单工厂模式通过静态工厂方法创建对象,适用于产品较少的情况,但扩展性较差。工厂方法模式则通过抽象工厂和具体工厂实现,提高了扩展性,减少了耦合。文章还讨论了两种模式的优缺点,并指出Java的反射机制和Spring框架如何进一步解决扩展问题。
摘要由CSDN通过智能技术生成

工厂模式主要是为创建对象提供过渡接口,以便将创建对象的具体过程屏蔽隔离起来,达到提高灵活性的目的。
分类:

  1. 简单工厂模式(Simple Factory)
  2. 工厂方法模式(Factory Method)
  3. 抽象工厂模式(Abtract Factory)

简单工厂模式

简单工厂模式又称静态工厂方法模式。目的:定义一个用于创建对象的接口。

  1. 工厂类角色:有一定的商业逻辑和判断逻辑。【一个具体类实现
  2. 抽象产品角色:具体产品继承的父类或者实现的接口。【接口或者抽象类实现
  3. 具体产品角色:工厂类所创建的对象就是此角色的实例。【具体类实现

interface Car {
    public void drive();
}

class Benz implements Car{
    @Override
    public void drive() {
        System.out.println("Driving Benz");
    }
}

class Bmw implements Car{
    @Override
    public void drive() {
        System.out.println("Driving Bmw");
    }
}
class Audi implements Car{
    @Override
    public void drive() {
        System.out.println("Driving Audi");
    }
}
class Driver{
    // 工厂方法: 返回类型为抽象产品角色
    public static Car driverCar(String s) throws Exception{
        // 判断逻辑,返回具体的产品角色
        if (s.equalsIgnoreCase("Benz")){
            return new Benz();
        } else if (s.equalsIgnoreCase("Bmw")){
            return new Bmw();
        } else if (s.equalsIgnoreCase("Audi")){
            return new Audi();
        } else {
            throw new Exception();
        }
    }
}
public class Magnate{
    public static void main(String[] args) {
        try{
            Car car = Driver.driverCar("benz");
            car.drive();
        } catch (Exception e){
            e.printStackTrace();
        }
    }
}

优缺点:
每增加一个产品的时候,只要符合抽象接口就可以被下层消费。但是每增加一个产品,都需要更改driverCar这个工厂中的判断逻辑和业务逻辑

工厂方法模式

工厂方法模式去掉了简单工厂模式中工厂方法的静态属性,使得它可以被子类继承。
它的组成:

  1. 抽线工厂角色:这是工厂方法模式的核心,它与应用程序无关。【抽象类或者接口
  2. 具体工厂角色:含有和具体业务逻辑有关的代码。由应用程序调用以创建对应的具体产品对象。
  3. 抽象产品角色:具体产品继承的父类或者是实现的接口。【抽象类或者接口实现
  4. 具体产品角色:具体工厂所创建的对象就是此角色的实例。【具体类实现

package 工厂模式;

interface Car {
    void drive();
}

interface Driver{
    Car driverCar();
}

class Benz implements Car{
    @Override
    public void drive() {
        System.out.println("Driving Benz");
    }
}

class Bmw implements Car{
    @Override
    public void drive() {
        System.out.println("Driving Bmw");
    }
}
class Audi implements Car{
    @Override
    public void drive() {
        System.out.println("Driving Audi");
    }
}
class BenzDriver implements Driver{
    @Override
    public Car driverCar() {
        return new Benz();
    }
}

class BmwDriver implements Driver{
    @Override
    public Car driverCar() {
        return new Bmw();
    }
}

class AudiDriver implements Driver{
    @Override
    public Car driverCar() {
        return new Audi();
    }
}
public class Magnate{
    public static void main(String[] args) {
        try{
            Driver driver = new BenzDriver();
            driver.driverCar().drive();
        } catch (Exception e){
            e.printStackTrace();
        }
    }
}


在简单工厂模式中,新产品的加入要修改工厂角色中的判断语句;而在工厂方法模式中,要么将判断逻辑留在抽象工厂角色中,要么在客户端程序中将工厂角色写死。面对这种情况,Java的反射机制与配置文件的结合突破了限制---Spring。

 

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值