zoukankan      html  css  js  c++  java
  • OOAD-13 额外引入的简单工厂模式

    工厂模式是最常用的一类创建型设计模式,包括简单工厂模式、工厂方法模式和抽象工厂模式。简单工厂模式是最简单的一种

    简单工厂模式的定义

      定义一个工厂类,它可以根据参数的不同返回不同类的实例,被创建的实例通常都具有共同的父类。

      因为在简单工厂模式中用于创建实例的方法是静态方法,因此简单工厂模式又被称为静态工厂模式。因此简单工厂模式又被称为静态工厂方法,它属于类创建型模式,但不属于23中设计模式。

    简单工厂模式的结构

      Factory(工厂角色):工厂角色就是工厂类。负责实现创建所有产品的内部逻辑。工厂类定义了静态的工厂方法。可以被外部直接调用,根据参数的不同返回不同的产品对象。但是产品对象的创建实际是推迟到具体子类的构造方法中。因此,简单工厂模式将对象的创建推迟到不同的子类中,所以是类创建模式。

      Product(抽象产品角色):它是工厂类所创建的所有产品的父类,或者抽象。封装了各种产品的共有方法。由于它的出现,保障了工厂角色和子类之间的解耦。工厂角色中只需要定义一个通用的工厂方法。返回类型是Product就可以了。

      DifferentProduct(具体产品类):它是简单工厂模式的创建目标,所有被创建的对象都充当这个角色的某个具体类的实例。

      

      在简单工厂模式中,客户端通过调用工厂类的静态工厂方法来创建不同产品的实例。而无须通过new关键字去创建。其实。通过简单工厂模式去创建对象时,把真正的创建步骤延迟到各个子类的构造方法中。(不一定是构造方法,也可能是getInstance())。

    package com.dding.pmsmigrateServer.test;
    
    //客户端
    public class Test {
        public static void main(String[] args) {
            Product product = ProjectFactory.getProduct("Jeff");
        }
    }
    //抽象产品类
    abstract class Product{
        void dance(){};
    }
    //子产品类
    class Jeff extends Product{
        void dance(){
            System.out.println("jeff dance");
        }
        void say(){
    
        }
    }
    //子产品类
    class Join extends Product{
        void dance(){
            System.out.println("join dance");
        }
    }
    //工厂类
    class ProjectFactory{
        public static Product getProduct(String name){
            if (name.equals("Jeff")){
                return new Jeff();
            }
            if (name.equals("join")){
                return new Join();
            }
            return null;
        }
    }
    

    静态工厂模式的优点

      工厂类包含必要的判断逻辑,可以决定在什么时候创建哪一个产品类的实例。客户端可以免除直接创建产品对象的职责。而仅仅消费产品。因此简单工厂模式实现了对象创建和使用的分离。

      可能我们觉得客户端直接去创建产品也没什么大不了。因为也就是new一下对象。但是我们可以设想。如果子类多且名称复杂。客户端直接去创建子类就显得代码混乱且容易造成错误。因为你可能代码中有十几个类的new。都看不懂new的是什么。但是如果使用简单工厂方法,首先是我们定义了统一的对象获取接口,代码整齐划一,其次,我们去记录简单的参数要比记录复杂的子类名要容易得多。

    静态工厂模式的缺点

      工厂类中集中了所有产品的创建逻辑。职责很重,一旦工厂类挂壁了。整个系统都得挂壁

      系统扩展困难。一旦添加了新的产品就得去更改工厂类中的静态工厂方法。在产品类型较多的时候,有可能造成工厂类中的静态工厂方法逻辑复杂。违背了开闭原则。开闭接口是希望面向接口编程。出现新的产品的时候新增新产品子类就可以了。不应该去改之前的代码。但是在简单工厂模式中,必须要去更改工厂类中的静态工厂方法。

    简单工厂模式由于使用的是静态的工厂方法,因此,工厂类就无法形成基于继承的等级结构。

    简单工厂模式的典型应用和源码分析 https://blog.csdn.net/wwwdc1012/article/details/82504040  

      Calendar类获取日历类对象

      Calendar抽象类,该类的子类有BuddhistCalenda、JapaneseImperialCalendar、GregorianCalendar、RollingCalendar.Calendar抽象类中提供了一个getInstance方法。根据参数然后通过switch case java8/ if-else java7来创建相应的子类对象。也就是说在calendar中也用了简单工厂模式。只不过Calendar类一个人包揽了抽象产品和工厂类的角色罢了。

  • 相关阅读:
    STL学习笔记数值算法
    FreeTextBox使用
    IOS 通过ObjectiveC读取、解析Excel
    在C#中使用访问者(Visitor)模式对组合(Composite)对象进行验证
    监测ASP.NET应用程序性能最简单的方法
    Web开发常见的几个漏洞解决方法
    FTP文件操作之下载文件
    你所需要知道的一些git 的使用命令:历史
    C#中Hashtable、Dictionary详解以及写入和读取对比
    日志组件:log4j、logback、commonlogging
  • 原文地址:https://www.cnblogs.com/exceptionblog/p/11064228.html
Copyright © 2011-2022 走看看