IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> Java知识库 -> 简述工厂模式 -> 正文阅读

[Java知识库]简述工厂模式

引入

我们通过一个题目来引入到今天的话题–工厂模式

某某单位准备开发一个职工工资打印程序,该工资需要打印职工工号、职工工资类别,工资数。(其中工资类别目前根据需求知道的有,Manager、Engineer还有其他的暂不知道如Salse等等。并且Manager类别的工资是年薪20万元,Engineer类别的工资是月薪5000元)该单位委托某IT企业进行开发,该开发团队的经理要求开发团队使用迭代递增开发方法,要求能适应工资类别变化这一需求,现在假设你是这位团队经理,要求给出这个工资打印程序的设计。

拿到这道题明确的告诉你了要使用迭代递增开发方法,要求能适应工资类别变化这一需求。而工厂模式就是解决可扩展性最佳的模式之一。

工厂模式:工厂模式是克服了简单工厂模式的缺点,主要是满足了OCP(Open-Closed Principle开闭原则)。
简单工厂模式的工厂类 随着产品类的增加需要增加很多方法(或代码),而工厂方法模式每个具体工厂类只完成单一任务,代码简洁。工厂方法模式完全满足OCP,使它有非常良好的扩展性。


用UML工具Astah设计工厂模式

类图 :
请添加图片描述
顺序图
请添加图片描述

主要代码:

用Java实现,主要利用了Java的类名反射机制。
Class.forName(empStr+“Factory”).getDeclaredConstructor().newInstance()

Client类
Client类为入口,主要工作为提供用户输入的接口

import java.lang.reflect.InvocationTargetException;
import java.util.Scanner;

public class Client {
	public static void main(String[] args) throws ClassNotFoundException, NoSuchMethodException, InvocationTargetException, InstantiationException, IllegalAccessException {
		Scanner sc =new Scanner(System.in);
		System.out.println("please input employee:");
		String empStr = sc.next();
		sc.close();
		//
		Employee employee;
		IEmployeeFactory ief;
		ief=(IEmployeeFactory)Class.forName(empStr+"Factory").getDeclaredConstructor().newInstance();
		employee=ief.createEmployee();
		employee.printSalary();
	}
}

Employee类
Employee类为虚类,为主类调用工资打印程序提供接口,实现依赖倒转原则,为Engineer、Manager等的父类。

abstract public class Employee {
	public abstract void printSalary();
}

Engineer类
打印工资程序的具体实例

public class Engineer extends Employee {
	public void printSalary() {
		System.out.println("Engineer salary is:10000");
	}
}

工厂类:

IEmployeeFactory类
IEmployeeFactory类是工厂类的接口,这个是和简单工厂最大的区别。用接口和类名反射机制提前定义用于创建对象的接口,让子类(具体工厂)决定实例化具体的某一个类,即在工厂和产品中间增加接口(抽象工厂),工厂不再负责产品的创建,由接口针对不同条件返回具体的类实例,由具体类实例(具体工厂)去实现。

public class EngineerFactory implements IEmployeeFactory {
	public Employee createEmployee() {
		return new Engineer();
	}
}

EngineerFactory类

public class EngineerFactory implements IEmployeeFactory {
	public Employee createEmployee() {
		return new Engineer();
	}
}

其他的具体实现类就只用继承虚类Employee和工厂接口IEmployeeFactory类,创造一个新的实例。

工厂模式是对简单工厂模式进行了抽象。
有一个抽象的Factory类(可以是抽象类和接口),这个类将不在负责具体的产品生产,而是只制定一些规范,具体的生产工作由其子类去完成。
一个抽象工厂对应一个抽象产品,一个具体工厂对应一个具体产品,这个具体的工厂就负责生产对应的产品。

工厂模式的优缺点

优点

工厂方法模式完全满足OCP,使其有非常良好的可扩展性和可维护性。

缺点

增加了类的数量,每有一个类需要打印就需要一个工厂类去匹配生产。

假如某个具体产品类需要进行修改,很可能需要修改对应的工厂类。
当同时需要修改多个产品类的时候,对工厂类的修改会变得相当麻烦。

工厂模式的适用范围

其实这一点在开篇的时候就提到了,(要使用迭代递增开发方法,要求能适应工资类别变化这一需求。而工厂模式就是解决可扩展性最佳的模式之一。)

当一个类不知道它所必须创建对象的类或一个类希望由子类来指定它所创建的对象时,当类将创建对象的职责委托给多个帮助子类中的某一个,并且你希望将哪一个帮助子类是代理者这一信息局部化的时候,可以使用工厂方法,支持多扩展少修改的OCP原则。

  Java知识库 最新文章
计算距离春节还有多长时间
系统开发系列 之WebService(spring框架+ma
springBoot+Cache(自定义有效时间配置)
SpringBoot整合mybatis实现增删改查、分页查
spring教程
SpringBoot+Vue实现美食交流网站的设计与实
虚拟机内存结构以及虚拟机中销毁和新建对象
SpringMVC---原理
小李同学: Java如何按多个字段分组
打印票据--java
上一篇文章      下一篇文章      查看所有文章
加:2021-10-22 10:49:50  更:2021-10-22 10:51:10 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/23 22:37:56-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码