工厂方法模式

来源:互联网 发布:中国人种基因知乎 编辑:程序博客网 时间:2024/06/16 14:37

工厂方法模式——Factory Method Pattern

定义:
定义一个创建对象的接口,让一个实例对象的创建延迟到该接口的子类。

这里写图片描述

工厂方法模式的4个角色:

  1. Product:抽象产品,具体产品的父类。
  2. ConcreteProduct:具体产品,其实例对象由具体工厂创建,与具体工厂一一对应。
  3. Factory:抽象工厂,是具体工厂的父类,用于创建产品对象,但具体的创建过程由具体工厂实现。
  4. ConcreteFactory:具体工厂,生产具体产品对象。

/** * 抽象产品接口:手机接口 */public interface Phone {    void describe();}/** * 具体产品类:SamSung手机 */public class SamSungPhone implements Phone {    @Override    public void describe() {        System.out.println("我是SamSung手机!");    }}/** * 具体产品类:HuaWei手机 */public class HuaWeiPhone implements Phone {    @Override    public void describe() {        System.out.println("我是HuaWei手机!");    }}/** * 具体产品类:Mi手机 */public class MiPhone implements Phone {    @Override    public void describe() {        System.out.println("我是Mi手机!");    }}/** * 抽象工厂接口:用于生产Phone实例对象 */public interface Factory {    Phone createPhone();}/** * 具体工厂类:SamSung工厂 */public class SamSungFactory implements Factory {    @Override    public Phone createPhone() {        System.out.println("SamSung手机正在创建中...");        return new SamSungPhone();    }}/** * 具体工厂类:HuaWei工厂 */public class HuaWeiFactory implements Factory {    @Override    public Phone createPhone() {        System.out.println("HuaWei手机正在创建中...");        return new HuaWeiPhone();    }}/** * 具体工厂类:Mi工厂 */public class MiFactory implements Factory {    @Override    public Phone createPhone() {        System.out.println("Mi手机正在创建中...");        return new MiPhone();    }}/** * 客户端 */public class Client {    public static void main(String[] args) {        Factory factory = new HuaWeiFactory();        Phone phone = factory.createPhone();        phone.describe();    }}// 运行结果:HuaWei手机正在创建中...我是HuaWei手机!

注意: 工厂方法不能是静态的,因为工厂方法由抽象工厂声明定义,是抽象的,因此无法声明为静态的。


工厂方法模式的优缺点:

  • 优点:
    • 解决了简单工厂模式在扩展时需要修改源码的缺点,扩展时只需成对地增加或减少具体产品类与具体工厂类,并让其实现抽象产品接口与抽象工厂接口。
  • 缺点:
    • 当增加新产品时,类的数量会成对增加。
    • 引入了抽象层,在一定程度上增加了实现难度。

使用场景:

  • 客户端不知道所需的对象的类。
  • 对象的创建由具体工厂负责。
原创粉丝点击