对象创建型 - 工厂方法模式

介绍

* 工厂方法模式(FACTORY METHOD)是一种常用的对象创建型设计模式
* 此模式的核心精神是封装类中不变的部分,提取其中个性化善变的部分为独立类,通过依赖注入以达到解耦、复用和方便后期维护拓展的目的
* 它的核心结构有四个角色,分别是 抽象工厂、具体工厂、抽象产品、具体产品

定义

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

简单工厂模式 vs 工厂方法模式

* 简单工厂模式相当于是一个工厂中有各种产品,创建在一个类中,客户无需知道具体产品的名称,只需要知道产品类所对应的参数即可,但是工厂的职责过重,而且当类型过多时不利于系统的扩展维护;
* 工厂方法模式相当于在简单工厂模式的基础上增加一个抽象工厂,在简单工厂模式下如果增加一个产品,要修改工厂类,不符合开闭原则。在工厂方法下,只需要增加具体工厂和具体产品即可;
* 工厂方法模式是简单工厂模式的进一步抽象,降低客户端代码的耦合性

部分来自知乎(https://www.zhihu.com/question/27125796)

使用场景

* 对于某个产品,调用者清楚地知道应该使用哪个具体工厂服务,实例化该具体工厂,生产出具体的产品来。Java Collection中的iterator() 方法即属于这种情况
* 只是需要一种产品,而不想知道也不需要知道究竟是哪个工厂为生产的,即最终选用哪个具体工厂的决定权在生产者一方,它们根据当前系统的情况来实例化一个具体的工厂返回给使用者,而这个决策过程这对于使用者来说是透明的

百度百科(https://baike.baidu.com/item/%E5%B7%A5%E5%8E%82%E6%96%B9%E6%B3%95%E6%A8%A1%E5%BC%8F/2361103?fr=aladdin)

入门案例:

UML图解:
[简单工厂]
1245315-20180101221122862-516491969.png

[工厂方法]
1245315-20180101221131128-1509936674.png

代码:

[Product]

Person:

public interface Person {
    void speak();
}

[ConcreteProduct]

Student:

public class Student implements Person {
    @Override
    public void speak() {
        System.out.println("我是学生");
    }
}

Worker:

public class Worker implements Person {
    @Override
    public void speak() {
        System.out.println("我是工人");
    }
}

[Creator]

Factory:

public interface Factory {
    Person createPerson();
}

[ConcreteCreator]

StudentFactory:

public class StudentFactory implements Factory {
    @Override
    public Person createPerson() {
        return new Student();
    }
}

WorkerFactory:

public class WorkerFactory implements Factory {
    @Override
    public Person createPerson() {
        return new Worker();
    }
}

测试:

public class Main {
    public static void main(String[] args){
//        Factory factory = new StudentFactory();
        Factory factory = new WorkerFactory();
        Person person = factory.createPerson();
        person.speak();
    }
}

转载于:https://www.cnblogs.com/tandi19960505/p/8169134.html

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值