工厂方法设计模式

导读:本篇文章讲解 工厂方法设计模式,希望对大家有帮助,欢迎收藏,转发!站点地址:www.bmabk.com

工厂方法设计模式——我的理解

简单点理解,就是为了将对象的创建与使用分离,并遵守对外开放对内封闭的原则,每个类 都有一个相应的 工厂对象,负责创建并初始化该类。

举例:

有许多手机制造商,如小米,华为,IPhone,三星等;客户只要手机产品,只知道产品名,而不关心手机的制造过程;客户不关心创建手机产品的细节,只关心产品的品牌和性能。


结构和图解

图解

https://img2018.cnblogs.com/blog/1419489/201906/1419489-20190628154133368-906051111.png

结构

  • 产品
组成(角色) 关系 作用
抽象产品(AbstractProduct) 具体产品的父类 描述具体产品的公共接口
具体产品(ConcreteProduct) 抽象产品的子类;工厂类创建的目标类 描述生产的具体产品
  • 工厂
组成(角色) 关系 作用
抽象工厂(AbstractFactory) 具体工厂的父类 描述具体工厂的公共接口
具体工厂(ConcreteFactory) 抽象工厂的子类;被外界调用 描述具体工厂;实现FactoryMethod工厂方法创建产品的实例
外界通过调用不同具体工厂类的方法,从而创建不同具体产品类的实例

实例源码

下面我们使用手机生产来讲解该模式
  1. Phone类:手机标准规范类(AbstractProduct)
public interface Phone {
    void make();
}
  1. MiniPhone类:制造小米手机(Product1)
public class MiniPhone implements Phone {
    public MiniPhone() {
        // 调用
        this.make();
    }
    // 
    @Override
    public void make() {
        // 制造的具体过程
        System.out.println("make xiaomi phone!");
    }
}
  1. IPhone类:制造苹果手机(Product2)
public class IPhone implements Phone {
    public IPhone() {
        // 调用
        this.make();
    }
    // 
    @Override
    public void make() {
        // 制造的具体过程
        System.out.println("make iphone!");
    }
}
  1. AbstractFactory类:生产不同产品的工厂的抽象类(*** AbstractFactory ***)
public interface AbstractFactory {
    Phone makePhone();
}
  1. MiniFactory类:生产小米手机的工厂(ConcreteFactory1)
public class MiniFactory implements AbstractFactory{
    // 创建
    @Override
    public Phone makePhone() {
        return new MiniPhone();
    }
}
  1. AppleFactory类:生产苹果手机的工厂(ConcreteFactory2)
public class AppleFactory implements AbstractFactory {
    // 创建
    @Override
    public Phone makePhone() {
        return new IPhone();
    }
}
  • 演示
public class Demo {
    public static void main(String[] arg) {

        AbstractFactory miniFactory = new MiniFactory();
        AbstractFactory appleFactory = new AppleFactory();

        miniFactory.makePhone();            // make xiaomi phone!
        appleFactory.makePhone();        // make iphone!
    }
}

优缺点

优点

  • 更符合开-闭原则

新增一种产品时,只需要增加相应的具体产品类和相应的工厂子类即可

  • 符合单一职责原则

每个具体工厂类只负责创建对应的产品

  • 不使用静态工厂方法,可以形成基于继承的等级结构

缺点

  • 一个具体工厂只能创建一种具体产品
  • 添加新产品时,除了增加新产品类外,还要提供与之对应的具体工厂类,系统类的个数将成对增加,在一定程度上增加了系统的复杂度;同时,有更多的类需要编译和运行,会给系统带来一些额外的开销。
  • 虽然保证了工厂方法内的对修改关闭,但对于使用工厂方法的类,如果要更换另外一种产品,仍然需要修改实例化的具体工厂类。

在Spring中的应用场景

控制反转

通常由应用程序直接使用 new 创建新的对象,为了将对象的创建和使用相分离,采用工厂方法模式方法,即应用程序将对象的创建及初始化职责交给工厂对象


想了解更多,快来关注吧

https://raw.githubusercontent.com/tangsengrou01/wechat/master/photo.jpg

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/69802.html

(0)
小半的头像小半

相关推荐

极客之音——专业性很强的中文编程技术网站,欢迎收藏到浏览器,订阅我们!