Java的设计模式(3)--工厂模式
工厂模式是定义一个用于创建对象的接口,让子类决定实例化哪一个类。工厂方法使一个类的实例化延迟到子类。
工厂模式涉及四种角色:
抽象产品(Product):抽象类或者接口,负责定义具体产品必须实现的方法;
具体产品(ConcreteProduct):具体产品是一个类,是抽象产品的具体实现类;
构造者(Creator):一个接口或者抽象类,构造者定义一个称作工厂方法的抽象方法,该方法返回具体产品类的实例;
具体构造者(ConcreteCreator):是构造者的具体实现,具体构造者会重写工厂方法,使该方法返回具体产品的实例。
其UML类图大概如下:

工厂方法模式优点:
1.使用工厂方法可以让用户的代码和某个特定类的子类代码解耦
2.工厂方法使用户不必知道它所使用的对象是怎样被创建的,只需要知道该对象有哪些方法即可。
使用场景:
用户需要一个类的子类实例但是不希望与子类耦合,或者用户不知道该类有哪些子类可以用
下面举个例子:创建药品对象
目前按照药品的规定设计一个抽象类Drug(),该抽象类特别规定了药品必须的成分和含量。Paracetamol子类创建安加黄敏一类的药品,Amorolfine创建盐酸阿莫罗芬一类的药品。药店开发的应用程序需要Drug子类实例向药店提供药品,因为药店没有能力给出药品各个成分的含量,药厂才可以,所以不能用Drug子类构造方法直接创建对象。
抽象产品:Drug类是药的统称,是药的抽象类,代码如下:
public abstract class drug{
String constitute;
String name;
public String getName(){
return name;
}
public String getConstitute(){
return constitute;
}
}
具体产品:Amorolfine和Paracetamol是两个具体的产品,代码如下
public class Paracetamol extends Drug{
String part1 = "乙酰氨基酚";
String part2 = "咖啡因";
String part3 = "人工牛黄";
String part4 = "马来酸氯苯";
public Paracetamol (String name,int[] a){
this.name = name;
this.part1 = "每粒含有"+this.part1+a[0]+"毫克\n";
this.part2 = "每粒含有"+this.part2+a[1]+"毫克\n";
this.part3 = "每粒含有"+this.part3+a[2]+"毫克\n";
this.part4 = "每粒含有"+this.part4+a[3]+"毫克\n";
this.constitute = this.part1 + this.part2 + this.part3 + this.part4;
}
}
public class Amorolfineextends Drug{
String part1 = "甲硝锉";
String part2 = "人工牛黄";
public Amorolfine(String name,int[] a){
this.name = name;
this.part1 = "每粒含有"+this.part1+a[0]+"毫克\n";
this.part2 = "每粒含有"+this.part2+a[1]+"毫克\n";
this.constitute = this.part1 + this.part2;
}
}
构造者:构造者接口DrugCreator:
public interface DrugCreator{
public abstract Drug getDrug();//工厂方法
}
具体构造者:ParaDrugCreator和AmorDrugCreator是两个具体构造者角色,代码如下
public class ParaDrugCreator implements DrugCreator{
public Drug getDrug(){
int[] a = {250,15,1,10};
Drug drug = new Paracetamol("安加黄敏胶囊",a);
return drug;
}
}
public class AmorDrugCreator implements DrugCreator{
public Drug getDrug(){
int[] a = {200,5};
Drug drug = new Amorolfine("甲硝锉胶囊",a);
return drug;
}
}
应用程序:
public class Application{
public static void main(String args[]){
DrugCreator creator = new ParaDrugCreator();
Drug drug = creator.getDrug();
System.out.println(drug.getName()+"的成分:");
System.out.println(drug.getConstitute());
creator = new AmorDrugCreator();
drug = creator.getDrug();
System.out.println(drug.getName()+"的成分:");
System.out.println(drug.getConstitute());
}
}
Java的设计模式(3)--工厂模式的更多相关文章
- Java常见设计模式之工厂模式
工厂模式在我们日常的应用中应当算是比较广泛的一种设计模式了.今天让我们一起来学习一下,工厂的设计模式. 工厂模式在<Java与模式>中分为三类: 1)简单工厂模式(Simple F ...
- 设计模式——抽象工厂模式及java实现
设计模式--抽象工厂模式及java实现 设计模式在大型软件工程中很重要,软件工程中采用了优秀的设计模式有利于代码维护,方便日后更改和添加功能. 设计模式有很多,而且也随着时间在不断增多,其中最著名的是 ...
- 浅析JAVA设计模式之工厂模式(一)
1 工厂模式简单介绍 工厂模式的定义:简单地说,用来实例化对象,取代new操作. 工厂模式专门负责将大量有共同接口的类实例化.工作模式能够动态决定将哪一个类实例化.不用先知道每次要实例化哪一个类. 工 ...
- java 设计模式之工厂模式与反射的结合
工厂模式: /** * @author Rollen-Holt 设计模式之 工厂模式 */ interface fruit{ public abstract void eat(); } ...
- Java设计模式之工厂模式(Factory模式)介绍(转载)
原文见:http://www.jb51.net/article/62068.htm 这篇文章主要介绍了Java设计模式之工厂模式(Factory模式)介绍,本文讲解了为何使用工厂模式.工厂方法.抽象工 ...
- Java 设计模式之工厂模式(二)
原文地址:Java 设计模式之工厂模式(二) 博客地址:http://www.extlight.com 一.背景 本篇内容是 Java 设计模式创建型模式的第二篇.上一篇主题为 <Java 设计 ...
- 浅析JAVA设计模式之工厂模式(二)
1 工厂方法模式简单介绍 工厂方法 (Factroy Method)模式:又称多态性工厂模式(Polymorphic Factory),在这样的模式中,核心工厂不再是一个详细的类.而是一个抽象工厂,提 ...
- java设计模式2————工厂模式
1.工厂模式介绍: 1.1.实现了创建者与调用者的分离 1.2.详细分类: 简单工厂模式 工厂方法模式 抽象工厂模式 1.3.所遵循的OOP原则: 开闭原则:对扩展开放,对修改关闭 依赖倒转原则:面向 ...
- Spring 实现两种设计模式:工厂模式和单态模式(单例模式)
本文摘自:李刚 著 <轻量级 Java EE企业应用实战 Struts2+Spring+hibernate整合开发> 在Spring 中大量使用的以下两种设计模式:工厂模式和单态模式. 工 ...
- python 设计模式之工厂模式 Factory Pattern (简单工厂模式,工厂方法模式,抽象工厂模式)
十一回了趟老家,十一前工作一大堆忙成了狗,十一回来后又积累了一大堆又 忙成了狗,今天刚好抽了一点空开始写工厂方法模式 我看了<Head First 设计模式>P109--P133 这25页 ...
随机推荐
- 配置Notepad++
Notepad++配置 1.自动换行 视图 - 自动换行 2.隐藏工具栏 设置 - 首选项... > 常用 > 工具栏 - 隐藏 3.隐藏菜单栏 设置 - 首选项... > 常用 & ...
- java循环获取多天时间
通过开始时间和结束时间循环获取时间: SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd"); Date star ...
- OpenFOAM 中的边界条件(二)【转载】
转载链接:http://xiaopingqiu.github.io/2016/04/02/Boundary-conditions-in-OpenFOAM2/ 本篇在上一篇的基础上来解读 OpenFOA ...
- 用win-acme给windows服务器添加SSL(Let's Encrypt)证书
本文是我今天用win-acme给windows服务器添加SSL(Let's Encrypt)证书的一个过程,主要是给我自己备忘的. 1.首先先在github上下载最新版的win-acme. 下载地址: ...
- Eclipse自动生成作者、日期注释等功能设置 (转载)
原文地址:http://blog.sina.com.cn/s/blog_4080505a0101guoh.html 在使用Eclipse 编写Java代码时,自动生成的注释信息都是按照预先设置好的格式 ...
- Linux 基于WEB开源的系统管理工具webmin
Webmin是目前功能最强大的基于Web的Unix系统管理工具.管理员通过浏览器访问Webmin的各种管理功能并完成相应的管理动作.目前Webmin支持绝大多数的Unix系统,这些系统除了各种版本的l ...
- IIS配置问题:WCF服务打开svc文件报错:请求的内容似乎是脚本,因而将无法由静态文件处理程序来处理
在参考网上多个教程后,我用IIS配置的网站终于能正常打开了,但是很快就发现了新的问题,在打开WCF服务中的svc文件时报错: HTTP 错误 404.17 - Not Found请求的内容似乎是脚本, ...
- C# 怎么生成DLL文件(转)
有两种方法: 但是一般这个使用 打开VS2008,依次点击:菜单->文件->新建项目->项目类型visual C#(这里假设为该项目所取的名字是DllBuild)-& ...
- IO流概述
作用: 处理设备之间的数据传输的 I: Input(输入) , O: Output(输出) 什么是输入和输出? 我们说输入和输出问题是站在内存的角度而言 , 如果我们程序读取硬盘上的数据那么就是输入 ...
- 机器学习 - 算法 - Xgboost 数学原理推导
工作原理 基于集成算法的多个树累加, 可以理解为是弱分类器的提升模型 公式表达 基本公式 目标函数 目标函数这里加入了损失函数计算 这里的公式是用的均方误差方式来计算 最优函数解 要对所有的样本的损失 ...