转载请注明出处: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设计模式菜鸟系列(四)工厂方法模式建模与实现的更多相关文章

  1. Java设计模式菜鸟系列(十五)建造者模式建模与实现

    转载请注明出处:http://blog.csdn.net/lhy_ycu/article/details/39863125 建造者模式(Builder):工厂类模式提供的是创建单个类的模式.而建造者模 ...

  2. Java设计模式(二) 工厂方法模式

    本文介绍了工厂方法模式的概念,优缺点,实现方式,UML类图,并介绍了工厂方法(未)遵循的OOP原则 原创文章.同步自作者个人博客 http://www.jasongj.com/design_patte ...

  3. JAVA设计模式——第 5 章 工厂方法模式【Factory Method Pattern】(转)

    女娲补天的故事大家都听说过吧,今天不说这个,说女娲创造人的故事,可不是“造人”的工作,这个词被现代人滥用了.这个故事是说,女娲在补了天后,下到凡间一看,哇塞,风景太优美了,天空是湛蓝的,水是清澈的,空 ...

  4. Java设计模式学习笔记(三) 工厂方法模式

    前言 本篇是设计模式学习笔记的其中一篇文章,如对其他模式有兴趣,可从该地址查找设计模式学习笔记汇总地址 1. 简介 上一篇博客介绍了简单工厂模式,简单工厂模式存在一个很严重的问题: 就是当系统需要引入 ...

  5. Java设计模式:Factory Method(工厂方法)模式

    概念定义 工厂方法(Factory Method)模式,又称多态工厂(Polymorphic Factory)模式或虚拟构造器(Virtual Constructor)模式.工厂方法模式通过定义工厂抽 ...

  6. Java 设计模式(四)-工厂方法模式 (FactoryMethod Pattern)

    1     概念定义 1.1   定义 定义一个用于创建对象的接口,让子类决定实例化哪一个类.工厂方法使一个类的实例化延迟到其子类. 1.2   类型 创建类模式 2     原理特征 2.1   类 ...

  7. Java设计模式从精通到入门四 工厂方法模式

    工厂方法模式 属于23中设计模式中创建型类型. 核心思想:工厂提供创建对象的接口,由子类决定实例化哪一个子类. 来源 ​ 设计模式之禅中的例子,女娲造人,通过八卦炉来进行造人,没有烧熟的为白人,烧太熟 ...

  8. C#设计模式系列:工厂方法模式(Factory Method)

    1. 工厂方法模式简介 1.1 定义 工厂方法模式定义一个用于创建对象的接口,让子类决定实例化哪一个类.工厂方法模式是以一个类的实例化延迟到其子类. Factory Method模式用于在不指定待创建 ...

  9. 设计模式总结篇系列:工厂方法模式(Factory Method)

    工厂方法模式适合于对实现了同一接口或继承了同一父类的一些类进行实例的创建.一般是通过定义一个工厂类,并在其方法中实现对具有上述特点的类对象的创建. 根据具体产生类对象的方法定义形式,又可以将其分为普通 ...

随机推荐

  1. 一道看似简单的sql需求(转)

    听说这题难住大批高手,你也来试下吧.ps:博问里的博友提出的. 原始数据 select * from t_jeff t  简单排序后数据 select * from t_jeff t order by ...

  2. hive RegexSerDe View

    EXTERNALkeyword它允许用户创建一个外部表.在表中的同时施工指定的路径中的实际数据(LOCATION).Hive 创建内部表时.会将数据移动到数据仓库指向的路径:若创建外部表,仅记录数据所 ...

  3. 怎么样cocos2d-x正在使用ECS(实体-包裹-制)建筑方法来开发一款游戏?

    简介 在我的博客,我翻译的几篇文章ECS文章.这些文章都是从Game Development站点.假设你对这个架构方式还不是非常了解的话.欢迎阅读理解 组件-实体-系统和实现 组件-实体-系统. 我发 ...

  4. Shuttle ESB 实践

    http://blog.csdn.net/liu765023051/article/category/2482069

  5. Android - 用Fragments实现动态UI - 和其他Fragments通信

    为了重用Fragment UI组件,应该把每个都设计为它自有的模块组件并且有自己的布局和行为.一旦定义了这些可重用的Fragment,你可以把它们和一个activity关联然后和程序的逻辑一起实现上层 ...

  6. 百度音乐搜索API介绍

    百度音乐搜索API的请求地址如下: [html] view plaincopy http://box.zhangmen.baidu.com/x?op=12&count=1&title= ...

  7. 文件搜索神器 Everything

    Everything 是一款 NTFS 磁盘格式下的文件搜索工具,1月5日发布测试版本 1.3.0.631b Beta,增加文件列表.收藏夹.自定义快捷键.高级搜索等功能,取消了比较实用的 etp/f ...

  8. PHP PDO sqlite ,Unable to Open database file的解决方法

    t.php在网站的根目录. fdy.db在inc文件夹下; t.php中sqlite路径写成相对路径 $db = new PDO('sqlite:inc/fdy.db'); 开始提示 Fatal er ...

  9. RH033读书笔记(12)-Lab 13 Finding and Processing Files

    Sequence 1: Using find Scenario: Log in as user student. Devise and execute a find command that prod ...

  10. 【夯实基础】javakeywordsynchronized 详细说明

    尊重版权:http://www.cnblogs.com/GnagWang/archive/2011/02/27/1966606.html Java语言的keyword.当它用来修饰一个方法或者一个代码 ...