我通过三个故事终于学明白了三种工厂模式

本文涉及的产品
云数据库 RDS MySQL,集群版 2核4GB 100GB
推荐场景:
搭建个人博客
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
RDS MySQL Serverless 高可用系列,价值2615元额度,1个月
简介: 我通过三个故事终于学明白了三种工厂模式

介绍

我认为把知识给别人讲会,讲明白,自己才彻底明白。

努力把文章写好,写明白每一篇文章,分享给更多人。

一个赞、一个评论、一个关注,真的好开心,努力没有白费,得到了这么多人的认可。


一、简单工厂模式

介绍:

  • 1、简单工厂模式是属于创建型模式,是工厂模式的一种。简单工厂模式是由一个工厂对象决定创建出哪个一种实体类的实例。简单工厂模式是工厂模式家族中最简单使用的模式。
  • 2、简单工厂模式:定义了一个创建对象的类,由这个类来封装实例化对象的行为
  • 3、在软件开发中,当我们会使用到大量的创建某种、某类或者某批对象时,就会使用到工厂模式。

大白话说:

你想要什么,告诉我,我给你就是了。

用出行的方式来举例子说明简单工厂模式。

假设人们需要出行时可以骑自行车,可以走路,可以坐公交,可以开私家车,还可以火车和飞机,当然了未来说不定还有飞船之类的。那么我们急用简单工厂模式来实现这个出行的功能:

(一)创建抽象出行类

package factory.simplefactory.goOut;
/**
 * @Auther: truedei
 * @Date: 2020 /20-4-26 22:49
 * @Description:
 */
public abstract class GoOut {
    //只是一个抽象的方法,具体的功能实现让交通工具去实现
    public abstract void run();
}

(二)创建出行方式具体实现类

(1)步行

package factory.simplefactory.goOut;
/**
 * @Auther: truedei
 * @Date: 2020 /20-4-26 22:51
 * @Description: 步行
 */
public class Walk extends GoOut{
    @Override
    public void run() {
        System.out.println("步行");
    }
}

(2)骑自行车

package factory.simplefactory.goOut;
/**
 * @Auther: truedei
 * @Date: 2020 /20-4-26 22:53
 * @Description: 骑自行车
 */
public class Bike extends GoOut{
    @Override
    public void run() {
        System.out.println("骑自行车");
    }
}

(3)开汽车

package factory.simplefactory.goOut;
/**
 * @Auther: truedei
 * @Date: 2020 /20-4-26 22:53
 * @Description:开汽车
 */
public class Car extends GoOut {
    @Override
    public void run() {
        System.out.println("开汽车");
    }
}

(三)创建工厂类

接下来创建一个工厂类,功能是提供给用户的出行的方式,用户只需要告诉工厂类他需要什么方式就好了。

package factory.simplefactory.goOut;
/**
 * @Auther: truedei
 * @Date: 2020 /20-4-26 22:58
 * @Description:为用户提供选择出行的方式。
 */
public class GoOutFactory {
    public static GoOut  createGoOut(String goOutType){
        GoOut goOut = null;
        switch (goOutType){
            case "walk":
                goOut = new Walk();
                break;
            case "bike":
                goOut = new Bike();
                break;
            case "car":
                goOut = new Car();
                break;
        }
        return goOut;
    }
}

(四)创建客户端测试

package factory.simplefactory.goOut;
/**
 * @Auther: truedei
 * @Date: 2020 /20-4-26 23:03
 * @Description:测试类
 */
public class TestGoOut {
    public static void main(String[] args) {
        GoOutFactory.createGoOut("car").run();
        GoOutFactory.createGoOut("walk").run();
        GoOutFactory.createGoOut("bike").run();
    }
}

测试结果:

开汽车
步行
骑自行车
Process finished with exit code 0

防爬虫,看到请忽略

文章作者:TrueDei

二、工厂方法模式

(一)介绍

工厂方法模式:定义了一个用于创建对象的接口,让子类决定要实例化的类。工厂方法模式将一个类的实例化延迟倒子类。

(二)看一下需求,需求如下

有一个看书的程序,最初只有Python书。但是呢随着发展,也会有越来越多的书。

(三)没有使用工厂方法的代码

package factory.Product;
/**
 * @Auther: truedei
 * @Date: 2020 /20-4-28 09:02
 * @Description:
 */
public class FactoryMethod {
    public static void main(String[] args) {
        Application application = new Application();
        ProductPython ogject = application.getOgject();
        ogject.method();
    }
}
class ProductPython{
    public void method(){
        System.out.println("这是Python的产品类的方法");
    }
}
class Application{
    private ProductPython createProduct(){
        return new ProductPython();
    }
    ProductPython getOgject(){
        ProductPython product = createProduct();
        return product;
    }
}

(四)使用工厂方法模式进行重构

为了公司业务的发展需求,可以使用工厂方法模式进行代码的重构。

/**
 * @Auther: truedei
 * @Date: 2020 /20-4-28 09:02
 * @Description:
 */
public class FactoryMethod {
    public static void main(String[] args) {
        Application application = new CreateProductPython();
        Product python = application.getObject();
        python.method();
        Application application1 = new CreateProductJava();
        Product java = application1.getObject();
        java.method();
    }
}
//1、把公共的、稳定的方法给抽象出来
interface Product{
    public void method();
}
class ProductPython implements Product{
    public void method(){
        System.out.println("这是Python的产品类的方法");
    }
}
class ProductJava implements Product{
    public void method(){
        System.out.println("这是Java的产品类的方法");
    }
}
class SimpleFactory{
    public static Product createProduct(String bookType){
        if(bookType.equals("python")){
            return new ProductPython();
        }else if(bookType.equals("Java")){
            return new ProductJava();
        }else {
            return null;
        }
    }
}
abstract class Application{
    abstract Product createProduct();
    Product getObject(){
        Product product = createProduct();
        return product;
    }
}
class CreateProductPython extends Application{
    @Override
    Product createProduct() {
        return new ProductPython();
    }
}
class CreateProductJava extends Application{
    @Override
    Product createProduct() {
        return new ProductJava();
    }
}

(五)使用场景

  • 1、在不知道该使用对象的准确类型的时候
  • 2、为方便扩展组件的时候

(六)主要优点

  • 1、将具体产品和创造者解耦
  • 2、符合单一职责原则
  • 3、符合开闭原则

三、抽象工厂模式

(一)介绍

提供一个创建一系列相关或互相依赖对象的接口,而无需指定它们具体的类。

(二)实例需求说明

开发一个数据库的组件。

可以看到针对的是数据库,那么数据库又有很多种类的数据库,例如:Mysql,Oracle等。

共性:

1、连接数据

2、执行数据库命令

3、等等…

(三)实现代码

package factory.abstractFactory;
/**
 * @Auther: truedei
 * @Date: 2020 /20-4-28 18:00
 * @Description:抽象工厂模式
 */
public class AbstractFactoryTest {
    public static void main(String[] args) {
        TrueDeiDatabaseUtils tdbu = new MysqlDataBaseUtils();
        TrueDeiConnection connection = tdbu.getConnection();
        connection.connect();//连接数据库
        TrueDeiCommand command = tdbu.getCommand();
        command.command();//发送命令
        TrueDeiDatabaseUtils Otdbu = new MysqlDataBaseUtils();
        TrueDeiConnection Oconnection = Otdbu.getConnection();
        Oconnection.connect();//连接数据库
        TrueDeiCommand Ocommand = tdbu.getCommand();
        Ocommand.command();//发送命令
    }
}
//抽象连接数据库的类
interface TrueDeiConnection{
    public void connect();
}
//抽象关闭数据库连接的类
interface TrueDeiCommand{
    public void command();
}
//工具类
interface TrueDeiDatabaseUtils{
    //连接数据库
    TrueDeiConnection getConnection();
    //发送命令
    TrueDeiCommand getCommand();
}
//实现Mysql的连接实例
class MysqlConnection implements TrueDeiConnection{
    @Override
    public void connect() {
        System.out.println("连接mysql数据库");
    }
}
//实现Mysql的发送命令的实例
class MysqlCommand implements TrueDeiCommand{
    @Override
    public void command() {
        System.out.println("向mysql数据库发送命令");
    }
}
//实现Mysql的工具类  有一组接口的是工厂模式,一个接口的是工厂方法模式
class MysqlDataBaseUtils implements TrueDeiDatabaseUtils{
    @Override
    public TrueDeiConnection getConnection() {
        return new MysqlConnection();
    }
    @Override
    public TrueDeiCommand getCommand() {
        return new MysqlCommand();
    }
}
//实现Mysql的连接实例
class OracleConnection implements TrueDeiConnection{
    @Override
    public void connect() {
        System.out.println("连接Oracle数据库");
    }
}
//实现Oracle的发送命令的实例
class OracleCommand implements TrueDeiCommand{
    @Override
    public void command() {
        System.out.println("向Oracle数据库发送命令");
    }
}
//实现Oracle的工具类
class OracleDataBaseUtils implements TrueDeiDatabaseUtils{
    @Override
    public TrueDeiConnection getConnection() {
        return new OracleConnection();
    }
    @Override
    public TrueDeiCommand getCommand() {
        return new OracleCommand();
    }
}

测试结果:

连接mysql数据库
向mysql数据库发送命令
连接mysql数据库
向mysql数据库发送命令

(四)应用场景

程序需要处理不同系列的相关产品,但是您不希望它依赖于这些产品的具体类时,可以使用抽象工厂。

(五)优点

  • 1、可以确信从工厂得到的产品彼此是兼容的;
  • 2、可以避免具体产品和客户端代码之间的紧密耦合;
  • 3、符合单一职责原则;
  • 4、符合开闭原则(当新增一个功能时,不需要去修改之前的)。

(六)在源码中的应用

像连接数据库的jdbc的接口(Connection)等。

相关实践学习
如何在云端创建MySQL数据库
开始实验后,系统会自动创建一台自建MySQL的 源数据库 ECS 实例和一台 目标数据库 RDS。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助     相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
目录
相关文章
|
24天前
|
设计模式 新零售 Java
设计模式最佳套路5 —— 愉快地使用工厂方法模式
工厂模式一般配合策略模式一起使用,当系统中有多种产品(策略),且每种产品有多个实例时,此时适合使用工厂模式:每种产品对应的工厂提供该产品不同实例的创建功能,从而避免调用方和产品创建逻辑的耦合,完美符合迪米特法则(最少知道原则)。
36 6
|
2月前
|
设计模式 算法
【设计模式】阿里终面:你觉得这个例子是策略模式吗?
【设计模式】阿里终面:你觉得这个例子是策略模式吗?
26 1
|
2月前
|
设计模式 缓存 算法
探索设计模式的魅力:创新思维与面试中的设计模式问题(超详细38题3万8字参考答案)
设计模式是在软件设计中经常出现的问题的解决方案。它是由经验丰富的开发人员在解决常见设计问题时总结出来的一套通用的解决方案,是一种对反复出现的设计问题的可重用的抽象描述。设计模式可以用于高质量的软件开发,它在软件开发过程中提供了一种复用可扩展性简化代码维护等方面的解决方案。设计模式通常包括以下几个要素:用来描述问题、解决方案和效果的简洁术语。描述了在何时使用该模式以及问题的背景和条件。
106 0
|
2月前
|
算法
犯错总结--工厂模式和策略模式傻傻没分清
犯错总结--工厂模式和策略模式傻傻没分清
45 0
犯错总结--工厂模式和策略模式傻傻没分清
|
11月前
|
设计模式 数据库
几张图带你手拿把掐设计模式六大原则
几张图带你手拿把掐设计模式六大原则
50 0
|
11月前
|
设计模式 Java 新能源
原来这么多年都用错了工厂模式
原来这么多年都用错了工厂模式
99 0
|
12月前
|
设计模式
设计模式-原型模式(简历复印)
设计模式-原型模式(简历复印)
57 0
|
Java 程序员
我该如何学好行为型模式(下)
我该如何学好行为型模式(下)
51 0
|
存储 算法 Java
我该如何学好行为型模式(上)
我该如何学好行为型模式(上)
35 0
|
设计模式 Java 关系型数据库
我终于读懂了工厂模式。。。
我终于读懂了工厂模式。。。
我终于读懂了工厂模式。。。