当前位置: 首页 > 编程日记 > 正文

《转》java设计模式--工厂方法模式(Factory Method)

本文转自:http://www.cnblogs.com/archimedes/p/java-factory-method-pattern.html

工厂方法模式(别名:虚拟构造)

定义一个用于创建对象的接口,让子类决定实例化哪一个类。Factory Method使一个类的实例化延迟到其子类。

概述

当系统准备为用户提供某个类的子类的实例,又不想让用户代码和该子类形成耦合时,就可以使用工厂方法模式来设计系统。工厂方法模式的关键是在一个接口或抽象类中定义一个抽象方法,该方法返回某个类的子类的实例,该抽象类或接口让其子类或实现该接口的类通过重写这个抽象方法返回某个子类的实例。

适用性

1.当一个类不知道它所必须创建的对象的类的时候。

2.当一个类希望由它的子类来指定它所创建的对象的时候。

3.当类将创建对象的职责委托给多个帮助子类中的某一个,并且你希望将哪一个帮助子类是代理者这一信息局部化的时候。

参与者

1.Product 定义工厂方法所创建的对象的接口。

2.ConcreteProduct 实现Product接口。

3.Creator 声明工厂方法,该方法返回一个Product类型的对象。 Creator也可以定义一个工厂方法的缺省实现,它返回一个缺省的ConcreteProduct对象。 可以调用工厂方法以创建一个Product对象。

4.ConcreteCreator 重定义工厂方法以返回一个ConcreteProduct实例。

工厂方法模式的结构与使用

模式的结构中包括四种角色:

•抽象产品(Product)

•具体产品(ConcreteProduct)

•构造者(Creator)

•具体构造者(ConcreteCreator)

模式的UML类图

实战部分

例1】:假设有三个笔芯,分别是红笔芯、蓝笔芯和黑笔芯。用户希望通过圆珠笔来明确笔芯的颜色。

模式的结构的描述与使用 

1.抽象产品(Product): PenCore.java

public abstract class PenCore{String color;public abstract void writeWord(String s);
}

2.具体产品(ConcreteProduct)_1 : RedPenCore.java

public class RedPenCore extends PenCore{RedPenCore(){color="红色";}public void writeWord(String s){System.out.println("写出"+color+"的字:"+s);}
}

具体产品(ConcreteProduct)_2 : BluePenCore.java

public class BluePenCore extends PenCore{BluePenCore(){color="蓝色";}public void writeWord(String s){System.out.println("写出"+color+"的字:"+s);}
}

具体产品(ConcreteProduct)_3: BlackPenCore.java

public class BlackPenCore extends PenCore{BlackPenCore(){color="黑色";}public void writeWord(String s){System.out.println("写出"+color+"的字:"+s);}
}

3.构造者(Creator): BallPen.java

public abstract class BallPen{BallPen(){System.out.println("生产了一只装有"+getPenCore().color+"笔芯的圆珠笔");}public abstract PenCore getPenCore(); //工厂方法
}

4.具体构造者(ConcreteCreator):

RedBallPen.java
public class RedBallPen extends BallPen{public PenCore getPenCore(){return new RedPenCore();}
}
BlueBallPen.java
public class BlueBallPen extends BallPen{public PenCore getPenCore(){return new BluePenCore();}
}
BlackBallPen.java
public class BlackBallPen extends BallPen{public PenCore getPenCore(){return new BlackPenCore();}
}

5.应用 Application.java

public class Application{public static void main(String args[]){PenCore penCore;BallPen ballPen=new BlueBallPen();penCore=ballPen.getPenCore();penCore.writeWord("你好,很高兴认识你");ballPen=new RedBallPen();penCore=ballPen.getPenCore();penCore.writeWord("How are you");ballPen=new BlackBallPen();penCore=ballPen.getPenCore();penCore.writeWord("nice to meet you");}
} 

工厂方法模式的优点

•使用工厂方法可以让用户的代码和某个特定类的子类的代码解耦。

•工厂方法使用户不必知道它所使用的对象是怎样被创建的,只需知道该对象有哪些方法即可。

作者:archimedes
出处:http://www.cnblogs.com/archimedes/
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利.

转载于:https://www.cnblogs.com/fanhongyun/p/4420189.html

相关文章:

微信小程序去除左上角返回的按钮

微信小程序开发交流qq群 173683895 承接微信小程序开发。扫码加微信。 正文: 解决方法有两种; 1.把该页面设置为tab页面或者主页 ; 2.进入该页面使用 wx.reLaunch(); 示例 wx.reLaunch({url: ../detail/detail,}) 这样有一个弊端,就是…

我的第一个web_登陆我的第一个全栈Web开发人员职位

我的第一个webby Robert Cooper罗伯特库珀(Robert Cooper) 登陆我的第一个全栈Web开发人员职位 (Landing My First Full Stack Web Developer Job) This is the story of the steps I took to get my first job as a full stack web developer. I think it’s valuable to sha…

HTTP请求报文和HTTP响应报文(转)

原文地址:http://blog.csdn.net/zhangliang_571/article/details/23508953 HTTP报文是面向文本的,报文中的每一个字段都是一些ASCII码串,各个字段的长度是不确定的。HTTP有两类报文:请求报文和响应报文。 HTTP请求报文 一个HTTP请…

微信小程序用户未授权bug解决方法,微信小程序获取用户信息失败解决方法

微信小程序开发交流qq群 173683895 承接微信小程序开发。扫码加微信。 正文: bug示例图: 导致这个bug的原因是 wx.getUserInfo(OBJECT) 接口做了调整; 请看官方文档的描述: wx.getUserInfo(OBJECT) 注意:此接口有…

格式化json日期'/Date(-62135596800000)/'

日期经过json序列化之后,变成了/Date(-62135596800000)/字符串,在显示数据时,我们需要解释成正常的日期。 Insus.NET和js库中,写了一个jQuery扩展方法: $.extend({JsonDateParse: function (value) {if (value /Date(…

aws lambda使用_使用AWS Lambda安排Slack消息

aws lambda使用Migrating to serverless brings a lot of questions. How do you do some of the non-serverless tasks, such as a cronjob in a serverless application?迁移到无服务器带来了很多问题。 您如何执行一些非无服务器的任务,例如无服务器应用程序中的…

微信小程序模块化开发 include与模板开发 template

微信小程序开发交流qq群 173683895 承接微信小程序开发。扫码加微信。 正文: 1. include 是引用整个wxml文件,我通常会配合js,css一起使用; 使用场景,需要封装事件和微信 api 的公共模块。 2.template &#xff…

winform解析json

在使用C#开发爬虫程序时,会遇到需要解析json字符串的情况。对于json字符串可以使用正则表达式的形式进行解析,更为方便的方法是使用Newtonsoft.Json来实现。 Nuget添加应用包 在工程上右键——【管理Nuget程序包】浏览找到要安装的程序包Newtonsoft.Jso…

Oracle11g密码忘记处理方法

c:\>sqlplus /nolog sql>connect / as sysdba sql>alter user 用户名 identified by 密码;(注意在这里输入的密码是区分大小写的) 改完之后你可以输入 sql>connect 用户名/密码 as sysdba进行验证 转载于:https://www.cnblogs.com/imhuanxi…

hic染色体构想_了解微服务:从构想到起点

hic染色体构想by Michael Douglass迈克尔道格拉斯(Michael Douglass) 了解微服务:从构想到起点 (Understanding Microservices: From Idea To Starting Line) Over the last two months, I have invested most of my free time learning the complete ins-and-outs…

[python]关于字符串查找和re正则表达式的效率对比

最近需要在python中做大日志文件中做正则匹配 开始直接在for in 中每行做re.findall,后来发现,性能不行,就在re前面做一个基本的字符串包含判断 (str in str),如果不包含直接continue 效率对比: 1、只做一次包含判断&a…

微信小程序客服功能 把当前页面的信息卡片发送给客服

微信小程序开发交流qq群 173683895 承接微信小程序开发。扫码加微信。 正文: 需求:微信小程序客服带详情页 , 场景:一个人通过微信小程序接入微信客服,聊天后带上入口链接 效果图: 写法: …

phpcms标签大全V9

转自&#xff1a;http://blog.csdn.net/cloudday/article/details/7343448调用头部 尾部{template "content","header"} 、 {template "content","footer"}{siteurl($siteid)} 首页链接地址 <a href"{siteurl($siteid)}/&q…

多伦多到温莎_我想要freeCodeCamp Toronto的Twitter来发布报价,所以我做了一个免费的bot来做到这一点。...

多伦多到温莎If you read About time, you’ll know that I’m a big believer in spending time now on building things that save time in the future. To this end, I built a simple Twitter bot in Go that would occasionally post links to my articles and keep my ac…

Linux常用命令汇总(持续更新中)

命令说明注意点cat access.log | wc -l统计行数awk命令可以做到同样的想过&#xff1a;cat access.log | awk END {print NR}grep vnc /var/log/messages查看系统报错日志等同于&#xff1a;sudo dmesg -T | grep "(java)"netstat -lnt | grep 590*查看端口状态 nets…

IOS问题汇总:2012-12-18 UIAlertView+UIActionSheet

UIAlertView/UIActionSheet UIAlertView * alertView [[UIAlertView alloc] initWithTitle:“添加场景模式” message:“请输入场景名称” delegate:self cancelButtonTitle:“取消” otherButtonTitles:“确定”, nil];alertView.alertViewStyle UIAlertViewStylePlainTextI…

PHP入门 1 phpstudy安装与配置站点

微信小程序开发交流qq群 173683895 承接微信小程序开发。扫码加微信。 1&#xff0c; 一键安装 phpstudy &#xff1b; 点击跳转下载&#xff1b; 2.配置站点&#xff0c;点击MySQL 其它选项菜单的站点域名管理&#xff1b;再点击新增 2&#xff0c;点击其他选项菜单点击打开…

singleton设计模式_让我们研究一下Singleton设计模式的优缺点

singleton设计模式by Navdeep Singh通过Navdeep Singh 让我们研究一下Singleton设计模式的优缺点 (Let’s examine the pros and cons of the Singleton design pattern) Design patterns are conceptual tools for solving complex software problems. These patterns are si…

【转】MFC消息映射详解(整理转载)

消息&#xff1a;主要指由用户操作而向应用程序发出的信息&#xff0c;也包括操作系统内部产生的消息。例如&#xff0c;单击鼠标左按钮&#xff0c;windows将产WM_LBUTTONDOWN消息&#xff0c;而释放鼠标左按钮将产生WM_LBUTTONUP消息&#xff0c;按下键盘上的字母键&#xff…

php 2 往数据库添加数据

微信小程序开发交流qq群 173683895 承接微信小程序开发。扫码加微信。 前端代码&#xff1a; function submit_result() { $.post("Controllers/ajaxController.php",{"name": $("#name").val(),"mobile": $("#mo…

设计模式:单例

传统的实现方法&#xff1a;两私一公&#xff0c;涉及线程安全问题&#xff08;即使有多重检查锁也可以通过反射破坏单例&#xff09;public class Singleton {private volatile static Singleton instance null;private Singleton () {}public static Singleton getSingleton…

100天59万行代码_如何抽出100天的代码时间

100天59万行代码Life moves pretty fast. If you don’t stop and look around once in a while, you could miss it. — Ferris Bueller生活发展很快。 如果您不停地走动&#xff0c;不时环顾四周&#xff0c;您可能会错过它。 —摩天轮 My time at freeCodeCamp was a fun an…

Mac 安装SecureCRT

scrt-8.0.2-1118.osx_x64.dmg https://pan.baidu.com/s/1miS5XVy 1.下载破解文件 SecureCRT https://pan.baidu.com/s/1eRW5IfS 2. 打开终端执行 chmod x ~/Downloads/SecureCRT 替换破解文件SecureCRT到/Applications/SecureCRT.app/Contents/MacOS/ 3. 打开SecureCRT&#xf…

PHP 3 HTML POST带参数请求 后端返回json格式的数据给前端

微信小程序开发交流qq群 173683895 承接微信小程序开发。扫码加微信。 前端代码 <!DOCTYPE html> <html lang"zh"><head><meta charset"UTF-8"><title>Title</title><script src"https://ajax.aspnetcdn.c…

产品经理入门_所以您想成为产品经理? 这就是我的入门方式。

产品经理入门by Melanie Lei由Melanie Lei 所以您想成为产品经理&#xff1f; 这就是我的入门方式。 (So you want to be a product manager? This is how I got started.) One of the most common questions I get asked is, “How do you get a Product Manager job if you…

又拍云SSL证书全新上线,提供一站式HTTPS安全解决方案

互联网快速发展&#xff0c;云服务早已融入每一个人的日常生活&#xff0c;而互联网安全与互联网的发展息息相关&#xff0c;这其中涉及到信息的保密性、完整性、可用性、真实性和可控性。又拍云上线了与多家国际顶级 CA 机构合作的数款OV & EV SSL证书&#xff0c;提供一站…

HDU 1155 Bungee Jumping

题意&#xff1a;英语水平太次…………读了好久好久好久才读懂OTZ James Bond要逃跑&#xff0c;跑到一个桥边上&#xff0c;要跳到地面&#xff0c;桥边有个有弹性的绳子长度为l&#xff0c;如果他跳下去能到达地面&#xff0c;但速度超过10就会摔死&#xff0c;否则能成功降落…

php 4 创建公共的链接数据库php文件并在其它文件引用它

微信小程序开发交流qq群 173683895 承接微信小程序开发。扫码加微信。 创建公共文件 <? //1. 声明字符编码 header("Content-Type:text/html;charsetutf8"); //2. 连接数据库 $linkmysql_connect("localhost","root","root");/…

异步回调地狱_如何逃避异步/等待地狱

异步回调地狱async/await freed us from callback hell, but people have started abusing it — leading to the birth of async/await hell.async / await使我们从回调地狱中解脱出来&#xff0c;但是人们已经开始滥用它-导致async / await地狱的诞生。 In this article, I …

2015年编程之美(资格赛) ---2月29日

时间限制:2000ms单点时限:1000ms内存限制:256MB描述 给定两个日期&#xff0c;计算这两个日期之间有多少个2月29日&#xff08;包括起始日期&#xff09;。 只有闰年有2月29日&#xff0c;满足以下一个条件的年份为闰年&#xff1a; 1. 年份能被4整除但不能被100整除 2. 年份能…