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();
        }
    }
    
  • 相关阅读:
    起名
    用超级巡警批量清除被挂马的网页
    我在csdn回复的帖子
    多线程与socket编程
    NET面试汇总
    第5 章: Windows Message Mapping 20080111 09:04 207人阅读 评论(0) 收藏
    oo的开始 分类: VC++ 20071228 14:31 176人阅读 评论(0) 收藏
    Cstring 截获数据 20080110 11:22 234人阅读 评论(0) 收藏
    截取字符串 20080110 08:18 188人阅读 评论(0) 收藏
    CString DOWRD互转 20080110 08:26 378人阅读 评论(0) 收藏
  • 原文地址:https://www.cnblogs.com/tandi19960505/p/8169134.html
Copyright © 2011-2022 走看看