• 对象创建型


    介绍

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

    定义

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

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

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

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

    使用场景

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

    百度百科(https://baike.baidu.com/item/工厂方法模式/2361103?fr=aladdin)

    入门案例:

    UML图解:
    [简单工厂]

    [工厂方法]

    代码:

    [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();
        }
    }
    
  • 相关阅读:
    【python】利用python+tkinter做一个简单的智能电视遥控器
    【selenium】自动化测试中,元素无法点击定位等问题的解决:js的使用方法
    《Selenium 2自动化测试实战 基于Python语言》中发送最新邮件无内容问题的解决方法
    单线程代码事例
    死锁的实例
    大公司的Java面试题集
    xml文件有误
    android开发艺术探索
    Java 获取APK安装程序的包名
    内部类中class声明地方不同,效果不一样
  • 原文地址:https://www.cnblogs.com/tandi19960505/p/8169134.html
Copyright © 2020-2023  润新知