设计模式(工厂模式)

设计模式(工厂模式)

一、工厂模式介绍

在工厂模式中,父类决定生成示例的方式,但不决定所要生成的具体的类,具体的处理部分交给子类负责。这样就可以将生成示例的框架和生成示例的类解耦。

二、示例程序

以下示例程序的作用是用来制作身份证(IdCard),它其中有5个类。

Product类和Factory类属于framework包,这两个类组成生成示例的框架。

Product类

framework包中的Product类是用来表示被工厂生成的"产品"的类。在该类中仅声明了use抽象方法,具体实现交给子类负责。

在这个框架中,定义了"产品"是"任意可以use"的东西。

java 复制代码
package com.pengpan.designmode.factory.framework;

/**
 * 产品抽象类
 */
public abstract class Product {
    public abstract void use();
}
Factory类

在这个框架中,我们定义了用来"生成产品"的createProduct()的抽象方法和用于注册产品的registerProduct()抽象方法。"生成产品"和"注册产品"的具体处理交给子类负责。

在这个框架中,我们定义了工厂是用来"调用create方法生成Product实例"的。

java 复制代码
package com.pengpan.designmode.factory.framework;

/**
 * 工厂抽象类
 */
public abstract class Factory {

    public final Product create(String userName) {
        Product product = createProduct(userName);
        registryProduct(product);
        return product;
    }

    protected abstract Product createProduct(String userName);

    protected abstract void registryProduct(Product product);

}
IDCard类
java 复制代码
package com.pengpan.designmode.factory.idcard;

import com.pengpan.designmode.factory.framework.Product;

public class IdCard extends Product {

    private final String userName;

    public IdCard(String userName) {
        this.userName = userName;
    }

    @Override
    public void use() {
        System.out.println("使用了" + userName + "的IdCard");
    }

    private String getUserName() {
        return this.userName;
    }
}
IDCardFactory类

IDCardFactory类实现了createProduct()方法和registerProduct()方法,用于生成IDCard和注册IDCard。

java 复制代码
package com.pengpan.designmode.factory.idcard;

import com.pengpan.designmode.factory.framework.Factory;
import com.pengpan.designmode.factory.framework.Product;

import java.util.ArrayList;
import java.util.List;

public class IdCardFactory extends Factory {

    List<Product> idCardList = new ArrayList<>();

    @Override
    public Product createProduct(String userName) {
        return new IdCard(userName);
    }

    @Override
    public void registryProduct(Product product) {
        idCardList.add(product);
    }
}
Main类
java 复制代码
package com.pengpan.designmode.factory;

import com.pengpan.designmode.factory.framework.Factory;
import com.pengpan.designmode.factory.framework.Product;
import com.pengpan.designmode.factory.idcard.IdCardFactory;

public class Main {
    public static void main(String[] args) {
        Factory factory = new IdCardFactory();
        Product cardZ = factory.create("张三");
        Product cardL = factory.create("李四");
        Product cardW = factory.create("王五");
        cardZ.use();
        cardL.use();
        cardW.use();
    }
}
相关推荐
CQU_JIAKE7 分钟前
4.17[Q]
java·linux·服务器
Hello--_--World13 分钟前
ES13:类私有属性和方法、顶层 await、at() 方法、Object.hasOwnProperty()、类静态块 相关知识点
开发语言·javascript·es13
Hugh-Yu-13012321 分钟前
二元一次方程组求解器c++代码
开发语言·c++·算法
weixin_5206498727 分钟前
C#进阶-特性全知识点总结
开发语言·c#
楼田莉子28 分钟前
同步/异步日志系统:日志落地模块\日志器模块\异步日志模块
linux·服务器·c++·学习·设计模式
文祐29 分钟前
C++类之虚函数表及其内存布局
开发语言·c++
亦暖筑序41 分钟前
Spring AI Alibaba 报错合集:我踩过的那些坑
java·后端
编程大师哥1 小时前
C++类和对象
开发语言·c++·算法
M158227690551 小时前
工业 CAN 总线无线互联利器|4 路 CAN 转 4G/WiFi 网关 产品介绍
开发语言·php
indexsunny1 小时前
互联网大厂Java面试实战:核心技术与微服务架构在电商场景中的应用
java·spring boot·redis·kafka·maven·spring security·microservices