工厂方法模式

工厂方法模式

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

工厂方法模式的核心是封装类中不变的部分,将可变的部分独立成额外的类,将实际的创建工作延迟到之类当中,代码会相对灵活一些。

工厂方法模式涉及到4个部分:

  1. 产品接口:定义产品规范,通常是接口或抽象类。
  2. 具体产品:实现产品接口的具体类。
  3. 工厂接口:定义实例化产品类的规范,通常是接口或抽象类。
  4. 具体工厂:实现工厂接口的具体类,决定实例化何种产品。


笔者下文例子中的频道类对应了产品接口,卡通频道和新闻频道是具体产品,而频道工厂则相当于工厂接口,卡通频道工厂和新闻频道工厂起到了具体工厂的作用。

工厂方法模式类图

工厂方法模式类图

  • 频道
public interface Channel {
    void watch();
}
  • 卡通频道
public class Cartoon implements Channel {
    @Override
    public void watch() {
        System.out.print("watch cartoon");
    }
}
  • 新闻频道
public class News implements Channel {
    @Override
    public void watch() {
        System.out.print("watch news");
    }
}
  • 频道工厂
public interface ChannelFactory {
    Channel createChannel();
}
  • 卡通频道工厂
public class CartoonFactory implements ChannelFactory {
    @Override
    public Channel createChannel() {
        return new Cartoon();
    }
}
  • 新闻频道工厂
public class NewsFactory implements ChannelFactory {
    @Override
    public Channel createChannel() {
        return new News();
    }
}
  • 客户端测试类
public class Client {
    public static void main(String[] args) {
        ChannelFactory channelFactory = new CartoonFactory();
        Channel channel = channelFactory.createChannel();
        channel.watch();
    }
}

运行结果:
watch cartoon

工厂方法模式之比于简单工厂模式,工厂方法模式实现时,客户端需要决定实例化哪一个工厂来创建产品实现类,选择判断的问题还是存在。也就是说,工厂方法把简单工厂的内部逻辑判断移到了客户端代码来进行。你想要加功能,本来是改工厂类,而现在是修改客户端。

简单工厂模式还是存在着对修改的开放问题,而工厂方法模式更好地实现了开闭原则。

但是工厂方法模式显著地增加了类的数量,每一个产品都需要对应一个工厂。并且增加了客户端调用类的负担,客户端调用类需要知道各个工厂的存在。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值