设计模式课程三:工厂模式之工厂方法

​ 在上一节中,我们知道 简单工厂模式 违背了开闭原则,扩展新的产品时需要修改工厂类。工厂方法模式对简单工厂做了进一步的抽象,使得产生新产品时不需要对原代码进行改动,满足开闭原则。

应用场景

  • 客户只知道创建产品的工厂名,而不知道具体的产品名。比如宝马车工厂,奔驰车工厂

  • 创建对象的任务由多个具体子工厂中的某一个完成,而抽象工厂只提供创建产品的接口

  • 客户不关心创建产品的细节,只关心产品的品牌

优点

  • 只需要知道具体工厂名就可得到所要的产品,无须关心产品的具体创建过程
  • 满足开闭原则,增加新产品时只需要创建一个对应的工厂类
  • 通过面向对象的手法,将所要创建的具体对象的创建工作延迟到了子类,从而提供了一种扩展的策略,较好的解决了这种紧耦合的关系

缺点

  • 类的个数容易增加到很多,复杂度增加
  • 一个工厂只能生成一种产品,可以使用 抽象工厂 来实现

类结构

在这里插入图片描述

Java实现示例

用工厂方法模式设计一个生成不同品牌车子的示例,可实现横向扩展新的品牌车而不用对原代码进行修改。

// 生成车工厂接口
public interface ICarFactory {

    /** 车的制造方法 */
    ICar create();
}

// 车的统一接口
public interface ICar {

    /**
     *  车子加油
     */
    void addOil();
}
// 第一个品牌,宝马车
public class BMWFactory implements ICarFactory {

    @Override
    public ICar create() {
        return new BMWCar();
    }
}

public class BMWCar implements ICar {

    @Override
    public void addOil() {
        System.out.println("BMW is adding oil..");
    }
}
// 第二个品牌,桑塔纳车(小船同学的座驾)
public class STNFactory implements ICarFactory {

    @Override
    public ICar create() {
        return new SangTaNa();
    }
}

public class SangTaNa implements ICar {

    @Override
    public void addOil() {
        System.out.println("SangTaNa is adding oil..");
    }
}
// 使用示例
public static void main(String[] args) {
    ICarFactory bmwFactory = new BMWFactory();
    ICarFactory stnFactory = new STNFactory();
    ICar bm = bmwFactory.create();
    ICar stn = stnFactory.create();
    bm.addOil();
    stn.addOil();
}

// 运行结果
BMW is adding oil..
SangTaNa is adding oil..
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值