Java设计模式菜鸟系列(四)工厂方法模式建模与实现
转载请注明出处:http://blog.csdn.net/lhy_ycu/article/details/39760895
工厂方法模式(Factory Method)
工厂方法:顾名思义,就是调用工厂里的方法来生产对象(产品)的。
工厂方法实现方式有3种:
一、普通工厂模式。就是建立一个工厂类,对实现了同一接口的一些类进行实例的创建。
1、uml建模图:
2、代码实现
/**
* 演示样例(一):普通工厂方法
*
* 缺点:假设传递的字符串出错,则不能正确创建对象
*/
interface Sender {
public void send();
} class EmailSender implements Sender { @Override
public void send() {
System.out.println("使用电子邮箱发送...");
} } class SmsSender implements Sender { @Override
public void send() {
System.out.println("使用短信发送...");
} } /**
* 产品工厂
*/
class SendFactory {
public Sender produceSender(String type) {
if ("email".equals(type)) {
return new EmailSender();
} else if ("sms".equals(type)) {
return new SmsSender();
} else {
System.out.println("没有这样的类型...");
return null;
} }
} /**
* client測试类
*
* @author Leo
*/
public class Test {
public static void main(String[] args) {
// 创建工厂
SendFactory sendFactory = new SendFactory();
// 生产产品
Sender sender = sendFactory.produceSender("email");
// 发货
sender.send();
} }
二、多个工厂方法模式。是对普通工厂方法模式的改进,在普通工厂方法模式中,假设传递的字符串出错,则不能正确创建对象,而多个工厂方法模式是提供多个工厂方法,分别创建对象。
1、uml建模图:
2、代码实现
/**
* 演示样例(二):多个工厂方法
*
* 长处:多个工厂方法模式是提供多个工厂方法,分别创建对象
*/
interface Sender {
public void send();
} class EmailSender implements Sender { @Override
public void send() {
System.out.println("使用电子邮箱发送...");
} } class SmsSender implements Sender { @Override
public void send() {
System.out.println("使用短信发送...");
} } /**
* 不同方法分别生产对应的产品
*/
class SendFactory {
public Sender produceEmail() {
return new EmailSender();
} public Sender produceSms() {
return new SmsSender();
}
} /**
* client測试类
*
* @author Leo
*/
public class Test {
public static void main(String[] args) {
// 创建工厂
SendFactory sendFactory = new SendFactory();
// 生产产品
Sender senderEmail = sendFactory.produceEmail();
// 发货
senderEmail.send();
} }
三、静态工厂方法模式。将上面的多个工厂方法模式里的方法置为静态的,不须要创建实例,直接调用就可以。
1、uml建模图:
2、代码实现
/**
* 演示样例(三):静态工厂方法
*
* 长处:多个工厂方法模式是提供多个工厂方法,分别创建对象
*/
interface Sender {
public void send();
} class EmailSender implements Sender { @Override
public void send() {
System.out.println("使用电子邮箱发送...");
} } class SmsSender implements Sender { @Override
public void send() {
System.out.println("使用短信发送...");
} } /**
* 静态工厂:不同实例化工厂
*
* 不同方法分别生产对应的产品
*/
class SendFactory {
public static Sender produceEmail() {
return new EmailSender();
} public static Sender produceSms() {
return new SmsSender();
}
} /**
* client測试类
*
* @author Leo
*/
public class Test {
public static void main(String[] args) {
// 直接生产产品
Sender senderEmail = SendFactory.produceEmail();
// 发货
senderEmail.send();
} }
四、总结
整体来说,凡是出现了大量的产品须要创建,而且具有共同的接口时,能够通过工厂方法模式进行创建。在以上的三种模式中,第一种假设传入的字符串有误,不能正确创建对象,第三种相对于另外一种,不须要实例化工厂类,所以,大多数情况下,我们会选用第三种——静态工厂方法模式。
Java设计模式菜鸟系列(四)工厂方法模式建模与实现的更多相关文章
- Java设计模式菜鸟系列(十五)建造者模式建模与实现
转载请注明出处:http://blog.csdn.net/lhy_ycu/article/details/39863125 建造者模式(Builder):工厂类模式提供的是创建单个类的模式.而建造者模 ...
- Java设计模式(二) 工厂方法模式
本文介绍了工厂方法模式的概念,优缺点,实现方式,UML类图,并介绍了工厂方法(未)遵循的OOP原则 原创文章.同步自作者个人博客 http://www.jasongj.com/design_patte ...
- JAVA设计模式——第 5 章 工厂方法模式【Factory Method Pattern】(转)
女娲补天的故事大家都听说过吧,今天不说这个,说女娲创造人的故事,可不是“造人”的工作,这个词被现代人滥用了.这个故事是说,女娲在补了天后,下到凡间一看,哇塞,风景太优美了,天空是湛蓝的,水是清澈的,空 ...
- Java设计模式学习笔记(三) 工厂方法模式
前言 本篇是设计模式学习笔记的其中一篇文章,如对其他模式有兴趣,可从该地址查找设计模式学习笔记汇总地址 1. 简介 上一篇博客介绍了简单工厂模式,简单工厂模式存在一个很严重的问题: 就是当系统需要引入 ...
- Java设计模式:Factory Method(工厂方法)模式
概念定义 工厂方法(Factory Method)模式,又称多态工厂(Polymorphic Factory)模式或虚拟构造器(Virtual Constructor)模式.工厂方法模式通过定义工厂抽 ...
- Java 设计模式(四)-工厂方法模式 (FactoryMethod Pattern)
1 概念定义 1.1 定义 定义一个用于创建对象的接口,让子类决定实例化哪一个类.工厂方法使一个类的实例化延迟到其子类. 1.2 类型 创建类模式 2 原理特征 2.1 类 ...
- Java设计模式从精通到入门四 工厂方法模式
工厂方法模式 属于23中设计模式中创建型类型. 核心思想:工厂提供创建对象的接口,由子类决定实例化哪一个子类. 来源 设计模式之禅中的例子,女娲造人,通过八卦炉来进行造人,没有烧熟的为白人,烧太熟 ...
- C#设计模式系列:工厂方法模式(Factory Method)
1. 工厂方法模式简介 1.1 定义 工厂方法模式定义一个用于创建对象的接口,让子类决定实例化哪一个类.工厂方法模式是以一个类的实例化延迟到其子类. Factory Method模式用于在不指定待创建 ...
- 设计模式总结篇系列:工厂方法模式(Factory Method)
工厂方法模式适合于对实现了同一接口或继承了同一父类的一些类进行实例的创建.一般是通过定义一个工厂类,并在其方法中实现对具有上述特点的类对象的创建. 根据具体产生类对象的方法定义形式,又可以将其分为普通 ...
随机推荐
- [Django] Base class in the model layer
In the model layer, the Model class is the base class while the ModelBase class is metaclass.
- Android - 设置ImageView为全屏显示
设置ImageView为全屏显示 本文地址: http://blog.csdn.net/caroline_wendy ImageView默认会适应屏幕大小, 假设想使用全屏填充, 则须要使用: and ...
- XMPP得知--建立一个管理类
参考其他demo之后,设立一个管理类的发现看起来更舒服,理-- 但在建立与server连接其中.发现 Connect Error: { NSLocalizedDescription = &qu ...
- 在线maven
仓库
findmaven.net是一个查找Jar和查找Maven的Maven仓库搜索引擎.它能够依据Java开发人员提供的Class名或者Jar名找到包括它的Jar,同一时候提供Jar的Maven仓库链接, ...
- java提高篇(十三)-----字符串
可以证明,字符串操作是计算机程序设计中最常见的行为. 一.String 首先我们要明确,String并不是基本数据类型,而是一个对象,并且是不可变的对象.查看源码就会发现String类为f ...
- 配置Tomcat出现Unsupported major.minor version 51.0
在配置tomcat时,配置好jdk1.6,下载的tomcat8.0,结果执行start-up.bat,总是一闪而过,网上查了大量的资料,都说是可能是jdk没配置好,但实际上jdk的环境变量设置正常,后 ...
- Spark第一个研究笔记1一片 - Spark一个简短的引论
该公司推出的在线项目Spark拥有近1随着时间的推移.有效,Spark事实上,优秀的分布式计算平台,以提高生产力. 开始本篇笔记.此前的研究会Spark研究报告共享出来(由于篇幅的限制,它将被划分成制 ...
- 10624 - Super Number
题目链接 题意:给出n到m的范围,求出一个数在前i位数组成的数字能被i整除.假设存在输出这个数,假设不存在.输出-1. 思路:回溯,每次放第i位,然后推断是否符合题意.这题踩着时间过去的2.6s(看了 ...
- WPF学习(4)逻辑树和可视树
前面几节说了一些WPF的基础,包括XAML和布局等.在接下来的几节,我们来说说WPF的核心概念,包括逻辑树和可视树.依赖对象和依赖属性.路由事件.命令这几个部分.本节介绍下逻辑树(Logical Tr ...
- Java Swing创建自定义闪屏:在闪屏上添加Swing进度条控件(转)
本文将讲解如何做一个类似MyEclipse启动画面的闪屏,为Java Swing应用程序增添魅力. 首先看一下效果图吧, 原理很简单,就是创建一个Dialog,Dialog有一个进度条和一个Label ...