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类一个人包揽了抽象产品和工厂类的角色罢了。

原文地址:https://www.cnblogs.com/exceptionblog/p/11064228.html