Java23设计模式学习(课时三)抽象工厂模式

简介: Java23设计模式学习(课时三)抽象工厂模式

抽象工厂模式的定义:

抽象工厂模式(Abstract Factory Pattern)隶属于设计模式中的创建型模式,用于产品族的构建。抽象工厂是所有形态的工厂模式中最为抽象和最具一般性的一种形态。抽象工厂是指当有多个抽象角色时使用的一种工厂模式。抽象工厂模式可以向客户端提供一个接口,使客户端在不必指定产品的具体情况下,创建多个产品族中的产品对象。


工厂模式中的每一个形态都是针对一定问题的解决方案,工厂方法针对的是多个产品系列结构;而抽象工厂模式针对的是多个产品族结构,一个产品族内有多个产品系列。


案例走起:在代码中理解设计模式学的思想:


本案例大纲

Java的案例大纲

package coms.Design.Mode.abstact1;
/**
 * 抽象产品工厂
 * 总工厂
 * 生产手机
 * 定义生产产品的类型
 */
public interface IProductFactory {
    //生产手机产品
    IphoneProduct phoneProduct();
    //生产路由器产品
    IRouterProduct  routerProduct();
}

上面的 IProductFactory 是项目的总工厂 来设计产品的类型

package coms.Design.Mode.abstact1;
//手机产品接口
public interface IphoneProduct {
    void start();
    void shutdown();
    void callup();
    void sendSms();
    void reading();
}
package coms.Design.Mode.abstact1;
//路由器产品接口
public interface IRouterProduct {
    void  start();
    void shutdown();
    void  openwife();
    void seting();
    void X();
}

IRouterProduct  这是从总工厂中分离出来的一种产品为路由器

IphoneProduct  这是从总工厂中分离出来的一种产品为手机


先看华为工厂的代码:

package coms.Design.Mode.abstact1;
/**
 * 华为工厂
 */
public class HuWeiFactory  implements IProductFactory{
//手机系列
    @Override
    public IphoneProduct phoneProduct() {
        return new HuWeiPhone();
    }
//路由器系列
    @Override
    public IRouterProduct routerProduct() {
        return new HuWeiRouter();
    }
}
package coms.Design.Mode.abstact1;
/**
 * 华为手机
 */
public class HuWeiPhone implements  IphoneProduct{
    @Override
    public void start() {
        System.out.println("开启华为手机");
    }
    @Override
    public void shutdown() {
        System.out.println("关闭华为手机");
    }
    @Override
    public void callup() {
        System.out.println("开启华为手机打电话");
    }
    @Override
    public void sendSms() {
        System.out.println("开启华为手机发信息");
    }
    @Override
    public void reading() {
        System.out.println("开启华为手机阅读数据");
    }
}
package coms.Design.Mode.abstact1;
/**
 * 小米路由器
 */
public class HuWeiRouter implements IRouterProduct{
    @Override
    public void start() {
        System.out.println("开启华为路由器");
    }
    @Override
    public void shutdown() {
        System.out.println("关闭华为路由器");
    }
    @Override
    public void openwife() {
        System.out.println("华为打开WiFi");
    }
    @Override
    public void seting() {
        System.out.println("华为设置参数");
    }
    @Override
    public void X() {
        System.out.println("华为未知参数X");
    }
}

在看小米系列

package coms.Design.Mode.abstact1;
public class XiaomiFactory implements IProductFactory{
    @Override
    public IphoneProduct phoneProduct() {
        //创造小米手机
        return new XiaomiPhone();
    }
    @Override
    public IRouterProduct routerProduct() {
        //创造小米路由器
        return new XiaomiRouter();
    }
}
package coms.Design.Mode.abstact1;
/**
 * 小米手机
 */
public class XiaomiPhone implements  IphoneProduct{
    @Override
    public void start() {
        System.out.println("开启小米手机");
    }
    @Override
    public void shutdown() {
        System.out.println("关闭小米手机");
    }
    @Override
    public void callup() {
        System.out.println("开启小米手机打电话");
    }
    @Override
    public void sendSms() {
        System.out.println("开启小米手机发信息");
    }
    @Override
    public void reading() {
        System.out.println("开启小米手机阅读数据");
    }
}
package coms.Design.Mode.abstact1;
import java.security.spec.RSAOtherPrimeInfo;
/**
 * 小米路由器
 */
public class XiaomiRouter implements IRouterProduct{
    @Override
    public void start() {
        System.out.println("开启路由器");
    }
    @Override
    public void shutdown() {
        System.out.println("关闭路由器");
    }
    @Override
    public void openwife() {
        System.out.println("小米打开WiFi");
    }
    @Override
    public void seting() {
        System.out.println("小米设置参数");
    }
    @Override
    public void X() {
        System.out.println("小米未知参数X");
    }
}

在看测试类

package coms.Design.Mode.abstact1;
/**
 * 测试类
 */
public class ClientTest {
    public static void main(String[] args) {
        System.out.println("========================小米产品=======================");
        XiaomiFactory xiaomiFactory = new XiaomiFactory();
        IphoneProduct iphoneProduct = xiaomiFactory.phoneProduct();
        iphoneProduct.reading();
        iphoneProduct.shutdown();
        System.out.println("==================小米路由器=================");
        IRouterProduct iRouterProduct = xiaomiFactory.routerProduct();
        iRouterProduct.openwife();
        iRouterProduct.start();
        iRouterProduct.X();
        System.out.println("========================华为系列产品=======================");
        HuWeiFactory huWeiFactory = new HuWeiFactory();
        IphoneProduct iphoneProduct1 = huWeiFactory.phoneProduct();
        iphoneProduct1.reading();
        iphoneProduct1.shutdown();
        System.out.println("==================华为路由器=================");
        IRouterProduct iRouterProduct1 = huWeiFactory.routerProduct();
        iRouterProduct1.openwife();
        iRouterProduct1.start();
        iRouterProduct1.X();
    }
}

代码解读

第一步 创建小米工厂


XiaomiFactory xiaomiFactory = new XiaomiFactory();


第二步:在小米工厂调用phoneProduct()

IphoneProduct iphoneProduct = xiaomiFactory.phoneProduct();


第三步 iphoneProduct.动作名

iphoneProduct.reading();

理清楚下面的关系:

1 在HuWeiFactory和XiaomiFactory 两个工厂中。

public class HuWeiFactory  implements IProductFactory{
public class XiaomiFactory implements IProductFactory{

2 在HuWeiPhone和HuWeiRouter 的两个实现类中分别实现的是 产品和路由器。

public class HuWeiPhone implements  IphoneProduct{
public class HuWeiRouter implements IRouterProduct{

3 同理  在XiaomiPhone和XiaomiRouter 的两个实现类中分别实现的是 产品和路由器。

关系理清楚了自己去画流程图吧!


工厂模式


◆小结:


◆简单工厂模式(静态工厂模式)


◆虽然某种程度 上不符合设计原则,但实际使用最多!◆工厂方法模式I


◆不修改已有类的前提下,通过增加新的工厂类实现扩展。◆抽象工厂模式


◆不可以增加产品,可以增加产品族!


◆应用场景:


◆JDK中Calendar的getInstance方法◆JDBC中的Connection对象的获取Spring中IOC容器创建管理bean对象◆反射中Class对象的newInstance方法

相关文章
|
2月前
|
XML Java 编译器
Java学习十六—掌握注解:让编程更简单
Java 注解(Annotation)是一种特殊的语法结构,可以在代码中嵌入元数据。它们不直接影响代码的运行,但可以通过工具和框架提供额外的信息,帮助在编译、部署或运行时进行处理。
97 43
Java学习十六—掌握注解:让编程更简单
|
1月前
|
Java 大数据 API
14天Java基础学习——第1天:Java入门和环境搭建
本文介绍了Java的基础知识,包括Java的简介、历史和应用领域。详细讲解了如何安装JDK并配置环境变量,以及如何使用IntelliJ IDEA创建和运行Java项目。通过示例代码“HelloWorld.java”,展示了从编写到运行的全过程。适合初学者快速入门Java编程。
|
2月前
|
存储 SQL 小程序
JVM知识体系学习五:Java Runtime Data Area and JVM Instruction (java运行时数据区域和java指令(大约200多条,这里就将一些简单的指令和学习))
这篇文章详细介绍了Java虚拟机(JVM)的运行时数据区域和JVM指令集,包括程序计数器、虚拟机栈、本地方法栈、直接内存、方法区和堆,以及栈帧的组成部分和执行流程。
39 2
JVM知识体系学习五:Java Runtime Data Area and JVM Instruction (java运行时数据区域和java指令(大约200多条,这里就将一些简单的指令和学习))
|
1月前
|
JavaScript Java 项目管理
Java毕设学习 基于SpringBoot + Vue 的医院管理系统 持续给大家寻找Java毕设学习项目(附源码)
基于SpringBoot + Vue的医院管理系统,涵盖医院、患者、挂号、药物、检查、病床、排班管理和数据分析等功能。开发工具为IDEA和HBuilder X,环境需配置jdk8、Node.js14、MySQL8。文末提供源码下载链接。
|
2月前
|
小程序 Oracle Java
JVM知识体系学习一:JVM了解基础、java编译后class文件的类结构详解,class分析工具 javap 和 jclasslib 的使用
这篇文章是关于JVM基础知识的介绍,包括JVM的跨平台和跨语言特性、Class文件格式的详细解析,以及如何使用javap和jclasslib工具来分析Class文件。
57 0
JVM知识体系学习一:JVM了解基础、java编译后class文件的类结构详解,class分析工具 javap 和 jclasslib 的使用
|
2月前
|
前端开发 Java 应用服务中间件
Javaweb学习
【10月更文挑战第1天】Javaweb学习
34 2
|
2月前
|
存储 缓存 Java
【用Java学习数据结构系列】HashMap与TreeMap的区别,以及Map与Set的关系
【用Java学习数据结构系列】HashMap与TreeMap的区别,以及Map与Set的关系
41 1
|
2月前
|
存储 搜索推荐 算法
【用Java学习数据结构系列】七大排序要悄咪咪的学(直接插入,希尔,归并,选择,堆排,冒泡,快排)以及计数排序(非比较排序)
【用Java学习数据结构系列】七大排序要悄咪咪的学(直接插入,希尔,归并,选择,堆排,冒泡,快排)以及计数排序(非比较排序)
29 1
|
2月前
|
存储 算法 Java
带你学习java的数组军队列
带你学习java的数组军队列
37 0
|
2月前
|
Java 大数据 开发工具
java学习——环境准备(1)
java学习——环境准备(1)
42 0