简单工厂模式

简单工厂模式(Simple Factory Pattern)是指由一个工厂对象决定创建出哪一种产品类的实例,但是它不属于设计模式。

简单工厂适用于工厂类负责创建的对象较少的场景,且客户端只需要传入工厂类的参数,对于如何创建对象的逻辑不需要关心。

定义产品对象

public interface ICar {
    void create();
}
public class BMCar implements ICar{
    @Override
    public void create(){
        System.out.println("制造BM车");
    }
}
public class ADCar implements ICar {
    @Override
    public void create() {
        System.out.println("制造AD车");
    }
}

创建工厂类

创建一个实现工厂类,所有的对象交由该工厂类创建

public class CarFactory {
    public ICar create(ICar car) {
        if (car instanceof BMCar) {
            return new BMCar();
        } else if (car instanceof ADCar) {
            return new ADCar();
        } else {
            return null;
        }
    }
}
    public static void main(String[] args) {
        CarFactory carFactory = new CarFactory();
        ICar bm = carFactory.create(new BMCar());
        bm.create();
        ICar ad = carFactory.create(new ADCar());
        ad.create();
    }

工厂使用反射

上述方式随着业务扩展,就需要修改createAnimal方法中的逻辑代码,不符合开闭原则。

可使用反射技术,即使业务变化扩展,也不需要修改AnimalFactory中的逻辑代码

public class CarFactory {
    public ICar create(String className) {
        try {
            if (!(null == className || "".equals(className))) {
                return (ICar) Class.forName(className).newInstance();
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
        return null;
    }
}
    public static void main(String[] args) {
        CarFactory carFactory = new CarFactory();
        ICar bm = carFactory.create("cn.ybzy.demo.BMCar");
        bm.create();
    }

上述方式的缺点是方法参数是字符串,有着不可控的风险。可进一步优化,使用强制类型限制,控制参数传递

public class CarFactory {
    public ICar create(Class<? extends ICar> clazz) {
        try {
            if (!(null == clazz)) {
                return clazz.newInstance();
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
        return null;
    }
}
    public static void main(String[] args) {
        CarFactory carFactory = new CarFactory();
        ICar bm = carFactory.create(BMCar.class);
        bm.create();
    }

工厂方法模式

概述

工厂方法模式是简单工厂模式的衍生,解决了许多简单工厂模式的问题。工厂方法模式属于创建型模式。

工厂模式(Factory Pattern)是Java中最常用的设计模式之一。它提供了一种创建对象的最佳方式。

它定义一个创建对象的接口,让其子类自己决定实例化哪一个工厂类,工厂模式使其创建过程延迟到子类进行。

在工厂方法模式中只需要关心所需产品对应的工厂,无须关心创建细节,而且加入新的产品符合开闭原则。

应用场景

1.创建对象需要大量重复的代码。

2.客户端(应用层)不依赖于产品类实例如何被创建、实现等细节。

3.一个类通过其子类来指定创建哪个对象。

优缺点

优点:

1.一个调用者想创建一个对象,只需要知道其名称就可以

2.扩展性高,如果想增加一个产品,只需要扩展一个工厂类

3.屏蔽产品的具体实现,调用者只关心产品的接口

缺点:

1.每增加一个产品时,都需要增加一个具体类和对象实现工厂,使系统中类的个数成倍增加,在一定程度上增加了系统的复杂度,同时也增加了系统具体类的依赖。

主要角色

1.抽象产品角色(Product)

工厂方法模式所创建的对象的超类型,也就是产品对象的共同父类或共同拥有的接口。

2.具体产品角色(Concrete Product)

这个角色实现了抽象产品角色所定义的接口。某具体产品有专门的具体工厂创建,它们之间往往一一对应。

3.抽象工厂角色(Creator)

是工厂方法模式的核心,与应用程序无关。任何在模式中创建的对象的工厂类必须实现这个接口。

4.具体工厂角色(Concrete Creator)

这是实现抽象工厂接口的具体工厂类,包含与应用程序密切相关的逻辑,并且受到应用程序调用以创建产品对象。

工厂方法模式的基本使用

创建抽象产品

创建抽象产品角色,工厂类所创建的产品的父类,封装了产品对象的公共方法

public abstract class AbstractCar {
    public abstract void run();
}

创建具体产品

public class Car extends AbstractCar {
    public void run() {
        System.out.println("Car run");
    }
}

创建抽象工厂

public abstract class ICarFactory {
    public abstract <T> T create(Class<T> clazz);
}

创建具体工厂

创建多个实现抽象工厂接口的具体工厂类。负责实现创建产品的内部逻辑,该工厂类可以被直接调用,创建所需的具体对象。

public class CarFactory extends ICarFactory {
    @Override
    public <T> T create(Class<T> clazz) {
        Car car;
        try {
            car = (Car) Class.forName(clazz.getName()).getConstructor().newInstance();
        } catch (Exception e) {
            throw new RuntimeException(e);
        }
        return (T) car;
    }
}

客户端执行

通过一个工厂类,对实现了同一接口的一些类进行实例的创建

    public static void main(String[] args) {
        ICarFactory factory = new CarFactory();
        Car car = factory.create(Car.class);
        car.run();
    }

Car run

到此这篇关于Java创建型设计模式之工厂方法模式深入详解的文章就介绍到这了,更多相关Java工厂方法模式内容请搜索Devmax以前的文章或继续浏览下面的相关文章希望大家以后多多支持Devmax!

Java创建型设计模式之工厂方法模式深入详解的更多相关文章

  1. Swift设计模式之工厂方法模式

    转自Swift设计模式原文Design-Patterns-In-Swift

  2. MVVM 不是那么好

    我觉得MVVM是一种反人类的设计模式,它使架构更加混乱而非清晰。MVVM命名很糟糕名称是很重要的。ViewModel这一名称则没有发挥任何作用。ViewModel的第一种含义是modelfortheview。MVVM引进太多职责命名不够具体,导致这个类的任务无休止地增长。MVVM不改变你的架构viewmodel并不能从根本上改变你的应用程序的架构。我能想到的MVVM模式最大的好处就是它把“下水道”从苹果自带的viewcontrooller类转移到了viewmodel这一自定义的对象。

  3. 开发Swift iOS应用程序“正确的方式”

    最近,我学习了Swift和开发iOS应用程序的基础知识。现在,我想自己开发一个真正的应用程序,但我非常关心编写好的代码,所以我已经寻找“最佳实践”,“设计模式”和“正确的方式”来实现它。在我的搜索中,我发现这个greattutorial关于SwiftiOS应用程序中通常使用的所有设计模式,以及他们使用的示例。不应该将httpClient和persistencyManager声明为协议,然后HttpClient和PersistencyManager类实现该协议?我应该在哪里告诉应用程序?最后但并非最不重要的

  4. Java利用POI实现导入导出Excel表格

    这篇文章主要为大家详细介绍了Java利用POI实现导入导出Excel表格,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下

  5. javascript的23种设计模式示例总结大全

    这篇文章主要为大家介绍了javascript的23种设计模式的总结大全,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪

  6. Java 阻塞队列BlockingQueue详解

    本文详细介绍了BlockingQueue家庭中的所有成员,包括他们各自的功能以及常见使用场景,通过实例代码介绍了Java 阻塞队列BlockingQueue的相关知识,需要的朋友可以参考下

  7. Java Bean 作用域及它的几种类型介绍

    这篇文章主要介绍了Java Bean作用域及它的几种类型介绍,Spring框架作为一个管理Bean的IoC容器,那么Bean自然是Spring中的重要资源了,那Bean的作用域又是什么,接下来我们一起进入文章详细学习吧

  8. 详解JavaScript实现设计模式中的适配器模式的方法

    适配器模式可以根据需求转换(或调整)一个接口,创建含有您所需接口的另一个对象,并将它连接到您想改变接口的对象,从而完成这种转换,下面就来详解JavaScript实现设计模式中的适配器模式的方法

  9. Java实现世界上最快的排序算法Timsort的示例代码

    Timsort 是一个混合、稳定的排序算法,简单来说就是归并排序和二分插入排序算法的混合体,号称世界上最好的排序算法。本文将详解Timsort算法是定义与实现,需要的可以参考一下

  10. PHP设计模式之工厂模式详解

    这篇文章主要为大家详细介绍了PHP设计模式之工厂模式,具有一定的参考价值,感兴趣的小伙伴们可以参考一下

随机推荐

  1. 基于EJB技术的商务预订系统的开发

    用EJB结构开发的应用程序是可伸缩的、事务型的、多用户安全的。总的来说,EJB是一个组件事务监控的标准服务器端的组件模型。基于EJB技术的系统结构模型EJB结构是一个服务端组件结构,是一个层次性结构,其结构模型如图1所示。图2:商务预订系统的构架EntityBean是为了现实世界的对象建造的模型,这些对象通常是数据库的一些持久记录。

  2. Java利用POI实现导入导出Excel表格

    这篇文章主要为大家详细介绍了Java利用POI实现导入导出Excel表格,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下

  3. Mybatis分页插件PageHelper手写实现示例

    这篇文章主要为大家介绍了Mybatis分页插件PageHelper手写实现示例,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪

  4. (jsp/html)网页上嵌入播放器(常用播放器代码整理)

    网页上嵌入播放器,只要在HTML上添加以上代码就OK了,下面整理了一些常用的播放器代码,总有一款适合你,感兴趣的朋友可以参考下哈,希望对你有所帮助

  5. Java 阻塞队列BlockingQueue详解

    本文详细介绍了BlockingQueue家庭中的所有成员,包括他们各自的功能以及常见使用场景,通过实例代码介绍了Java 阻塞队列BlockingQueue的相关知识,需要的朋友可以参考下

  6. Java异常Exception详细讲解

    异常就是不正常,比如当我们身体出现了异常我们会根据身体情况选择喝开水、吃药、看病、等 异常处理方法。 java异常处理机制是我们java语言使用异常处理机制为程序提供了错误处理的能力,程序出现的错误,程序可以安全的退出,以保证程序正常的运行等

  7. Java Bean 作用域及它的几种类型介绍

    这篇文章主要介绍了Java Bean作用域及它的几种类型介绍,Spring框架作为一个管理Bean的IoC容器,那么Bean自然是Spring中的重要资源了,那Bean的作用域又是什么,接下来我们一起进入文章详细学习吧

  8. 面试突击之跨域问题的解决方案详解

    跨域问题本质是浏览器的一种保护机制,它的初衷是为了保证用户的安全,防止恶意网站窃取数据。那怎么解决这个问题呢?接下来我们一起来看

  9. Mybatis-Plus接口BaseMapper与Services使用详解

    这篇文章主要为大家介绍了Mybatis-Plus接口BaseMapper与Services使用详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪

  10. mybatis-plus雪花算法增强idworker的实现

    今天聊聊在mybatis-plus中引入分布式ID生成框架idworker,进一步增强实现生成分布式唯一ID,具有一定的参考价值,感兴趣的小伙伴们可以参考一下

返回
顶部