设计模式之工厂方法模式

什么是工厂方法模式

    工厂方法模式定义了一个用于创建对象的接口,让子类决定将哪一个类实例化。工厂方法模式让一个类的实例化延迟到子类。

    与简单工厂模式相比,在新加入产品时工厂模式不需要修改工厂类,符合开闭原则。而且简单工厂模式中存在大量的if…else…代码,工厂类过于庞大加大了维护难度。
    工厂方法模式包含以下几个角色:

        Product(抽象产品):定义产品的接口,是工厂模式所创建对象的公共父类。
        ConcreteProduct(具体产品):实现了抽象产品接口,某种类型的具体产品由专门的具体工厂创建,具体工厂和具体产品之间一一对应。
        Factory(抽象工厂):在抽象工厂类中声明了工厂方法,用于返回一个产品。
        ConceteFactory(具体工厂):是抽象工厂的子类,实现了抽象工厂中定义的工厂方法。

    工厂模式是简单工厂模式的延伸,继承了简单工厂模式的优点,也弥补了简单工厂模式的不足。

工厂方法模式的优缺点

优点
  1. 在工厂模式中,工厂方法用来创建产品,同时还隐藏了哪种具体产品类会被实例化,客户端只关心所需要的产品对应的工厂。
  2. 工厂自主决定创建哪种产品对象,如何创建则在具体工厂内部实现。
  3. 加入新产品时无需修改工厂类,无需修改其他产品类,符合开闭原则。
缺点
  1. 新增新的产品时需要增加对应的产品类,工厂类,随着类越来越多增加了系统的复杂度。
  2. 由于考虑系统的扩展性,需要引入抽象层,增加了系统的抽象性和理解难度。

工厂方法模式的适用场景

  1. 当一个类不知道所要创建的对象类的时候。
  2. 当一个类希望由他的子类来指定所创建的对象的时候。

工厂方法模式案例


// 购买扫地机器人
// 抽象产品
public interface SweepingRobot {
    void orderRobot();
}

// 具体产品
public class XiaoMiRobot implements SweepingRobot {
    @Override
    public void orderRobot() {
        System.out.println("购买小米扫地机器人。");
    }
}

public class EcovacsRobot implements SweepingRobot {
    @Override
    public void orderRobot() {
        System.out.println("购买科沃斯扫地机器人.");
    }
}

// 选择一台扫地机器人
// 抽象工厂
public abstract class RobotFactory {
    public abstract SweepingRobot chooseOne();
}

// 具体工厂
public class XiaoMiRobotFactory extends RobotFactory{
    @Override
    public SweepingRobot chooseOne() {
        return new XiaoMiRobot();
    }
}

public class EcovacsRobotFactory extends RobotFactory {
    @Override
    public SweepingRobot chooseOne() {
        return new EcovacsRobot();
    }
}


public static void main(String[] args) {
    RobotFactory robotFactory = new XiaoMiRobotFactory();
    robotFactory.chooseOne().orderRobot();;

    robotFactory = new EcovacsRobotFactory();
    robotFactory.chooseOne().orderRobot();;
}

在这里插入图片描述

工厂方法模式在源码中的应用

Object

public class Object {
    // 重写 toString方法
    public String toString() {
        return getClass().getName() + "@" + Integer.toHexString(hashCode());
    }
    ......
}


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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值