zoukankan      html  css  js  c++  java
  • 对象创建型

    介绍

    * 工厂方法模式(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();
        }
    }
    
  • 相关阅读:
    html5+css3酷炫音频播放器代码
    js/html/css做一个简单的图片自动(auto)轮播效果//带注释
    gVIM+zencoding快速开发HTML/CSS/JS(适用WEB前端)
    使用libcurl,根据url下载对应html页面
    CSS+HTML+JQuery简单菜单
    【POJ1845】Sumdiv(数论/约数和定理/等比数列二分求和)
    【CodeForces727E/CF727E】Games on a CD (字符串哈希)
    【洛谷3224/BZOJ2733】[HNOI2012]永无乡 (Splay启发式合并)
    【BZOJ2565】最长双回文串 (Manacher算法)
    【洛谷2926/BZOJ1607】[USACO08DEC]Patting Heads拍头(筛法)
  • 原文地址:https://www.cnblogs.com/tandi19960505/p/8169134.html
Copyright © 2011-2022 走看看