创建型设计模式----简单工厂、工厂、抽象工厂

简单工厂模式

在简单工厂中可以根据字符串的不同返回不同的实例。它定义了一个专门的工厂类去创建类的实例,将类的创建和使用解耦。
在这里插入图片描述
具体实现如下,
1、定义一个接口

public  interface Fruit {
    String fruitName();
}

2、定义具体的实现

class Apple implements Fruit {
    @Override
    public String fruitName() {
        return "apple";
    }
}
class Banana implements Fruit {
    @Override
    public String fruitName() {
        return "banana";
    }
}
......

3、简单工厂类

class SimpleFactory {

    public static Fruit createFruit(String type) {
        Fruit f = null;
        switch (type) {
            case "apple" : f = new Apple();break;
            case "banana" : f = new Banana();break;
            default: break;
        } 
        return f;
    }
}

这里的工厂只有创建对象的功能,实际上也可以添加一些业务代码,如判断,日志等

优点:将对象的创建和对象的使用分离。工厂类隐藏了具体的创建细节
缺点:工厂类不够灵活,产品需要变动时每次都需要修改工厂类;而且产品过多的时候,工厂类代码会非常臃肿。

常见的场景
Java中的工具类DateFormat,加密技术KeyGenerator(密钥生成器)、Cipher(密码器)、Executors等

工厂模式

工厂模式的实现就是将上面简单工厂进行了解耦,在工厂方法模式中,每一个产品都对应了一个工厂子类,由工厂子类来负责生成具体的产品对象。这样生产产品的代码就不会耦合在同一个类中了。
工厂方法模式的结构图是这个样子的:
在这里插入图片描述
我们对上面的代码进行修改
1、创建工厂接口

interface FactoryI {
    Fruit createFruit();
}

2、具体产品类和简单工厂一样
3、工厂类

class AppleFac implements FactoryI {
    @Override
    public Fruit createFruit() {
        System.out.println("apple");
        return new Apple();
    }
}

class BananaFac implements FactoryI {
    @Override
    public Fruit createFruit() {
        System.out.println("banana");
        return new Banana();
    }
}

优点:当需要增加新产品时,无须修改现有的系统,并且封装了产品对象的创建细节。具有良好的灵活性和扩展性。
缺点:在添加新产品时需要添加新的工厂类,导致系统类的个数成对增加,一定程度上提高了系统的复杂程度。

常见的使用场景:
JDBC中的工厂方法

抽象工厂模式

假如现在的需求改变了,我还需要水果罐头,苹果罐头,香蕉罐头。如果使用工厂方法模式则需要增加抽象罐头工厂,苹果罐头类,香蕉罐头类 , 还有两个具体生产罐头类。那么增加这么多类势必会增加代码的复杂程度。那么我们可以使用抽象工厂来解决这个问题。

抽象工厂是解决产品族的问题,产品族比如海尔既有冰箱也有电视等这算是一个产品族。而工厂方法是解决产品等级,比如对于电视机,既有海尔的,也有TCL的。
抽象工厂的结构图:
在这里插入图片描述
1、罐头接口及其实现

interface Can {
    String canName();
}

class AppleCan implements Can{
    @Override
    public String canName() {
        return "appleCan";
    }
}

class BananaCan implements Can {
    @Override
    public String canName() {
        return "bananaCan";
    }
}

2、定义抽象工厂

interface AbstractFactory {
    Fruit createFruit();
    Can createCan();
}

3、定义Apple的相关产品工厂

class AppleFactory implements AbstractFactory {
    @Override
    public Fruit createFruit() {
        return new Apple();//苹果本身
    }

    @Override
    public Can createCan() {
        return new AppleCan();//苹果罐头
    }
}

4、定义Banana的相关产品

class BananaFactory implements AbstractFactory {
    @Override
    public Fruit createFruit() {
        return new Banana();
    }

    @Override
    public Can createCan() {
        return new BananaCan();
    }
}

所以抽象工厂和工厂方法模式区别就是抽象工厂是可以生产多个产品的,是一个产品族。

优点:隔离了具体类的生成,而且每次可以通过具体工厂创建一个产品族的多个产品,修改产品族比较方便,增加新的具体工厂和产品族比较方便
缺点:增加新的产品等级很复杂,需要修改抽象工厂和所有的具体工厂类

常见的应用场景
JavaAWT的抽象窗口工具包,程序中更换主题的功能

(如有错误,欢迎大家留言纠正 ,感谢!)

参考文章:
简单工厂模式、工厂模式以及抽象工厂模式

① 系统环境:Windows/Mac ② 开发语言:Java ③ 框架:SpringBoot ④ 架构:B/S、MVC ⑤ 开发环境:IDEA、JDK、Maven、Mysql ⑥ JDK版本:JDK1.8 ⑦ Maven包:Maven3.6 ⑧ 数据库mysql 5.7 ⑨ 服务平台:Tomcat 8.0/9.0 ⑩ 数据库工具:SQLyog/Navicat ⑪ 开发软件:eclipse/myeclipse/idea ⑫ 浏览器:谷歌浏览器/微软edge/火狐 ⑬ 技术栈:JavaMysql、Maven、Springboot、Mybatis、Ajax、Vue等 2、适用人群:计算机,电子信息工程等专业的学习者等, 高分毕业设计项目,也可作为课程设计和期末大作业。本资源仅是代码的压缩包,该代码适合毕业设计、课程设计作业,所有源码均经过严格测试,可以放心下载使用。有任何使用问题欢迎随时与博主沟通,第一时间进行解答! 3、解压说明:本资源需要电脑端使用WinRAR、7zip、Bandizip等解压工具进行解压 4、最新计算机软件毕业设计选题大全 https://blog.youkuaiyun.com/weixin_45630258/article/details/135901374 5、系统的实现说明 摘 要 I 目 录 III 第1章 绪论 1 1.1选题动因 1 1.2背景与意义 1 第2章 相关技术介绍 3 2.1 MySQL数据库 3 2.2 Vue前端技术 3 2.3 B/S架构模式 4 2.4 ElementUI介绍 4 第3章 系统分析 5 3.1 可行性分析 5 3.1.1技术可行性 5 3.1.2经济可行性 5 3.1.3运行可行性 6 3.2 系统流程 6 3.2.1 操作信息流程 6 3.2.2 登录信息流程 6 3.2.3 删除信息流程 7 3.3 性能需求 7 第4章 系统设计 8 4.1系统整体结构 8 4.2系统功能设计 9 4.3数据库设计 9 第5章 系统的实现 20 5.1用户信息管理 20 5.2 图片素材管理 20 5.3视频素材管理 21 5.1公告信息管理 22 第6章 系统的测试 24 6.1软件测试 24 6.2测试环境 24 6.3测试测试用例 24 6.4测试结果 25
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值