【设计模式】——工厂方法FactoryMethod
前言:【模式总览】——————————by xingoo
模式意图
工厂方法在MVC中应用的很广泛。
工厂方法意在分离产品与创建的两个层次,使用户在一个工厂池中可以选择自己想要使用的产品,而忽略其创建过程。
简单来说,就像一个大型的工厂,对于消费者来说,只需要知道都有什么工厂的产品生产出来,而不需要关心工厂是如何生产产品的。对于工厂来说,必须知道所有的产品的制造方法。
模式结构

Creator 创建工厂的接口
ConcreteCreator 具体的产品创建者
Product 产品的接口
ConcreteProduct 具体的产品
适合场景
1 当一个类不知道它所必须创建的对象的类的时候。
2 当一个类希望由他的子类来制定它所创建的对象的时候
3 当类创建对象的职责委托给多个帮助子类中的某一个,并且希望进行一些信息的局部初始化的时候。
代码结构
工厂方法需要一个工厂接口,提供了基本的类模式,和一个产品接口,提供基本的方法。
interface Creator{
public Product factory();
}
interface Product{
public void Say();
}
接下来就是具体的工厂方法,可以创建不同的产品。
class ConcreteCreator1 implements Creator{
public Product factory() {
return new ConcreteProduct1();
}
}
class ConcreteCreator2 implements Creator{
public Product factory() {
return new ConcreteProduct2();
}
}
其次需要不同的产品。
class ConcreteProduct1 implements Product{
public void Say() {
System.out.println("ConcreteProduct1");
}
}
class ConcreteProduct2 implements Product{
public void Say() {
System.out.println("ConcreteProduct2");
}
}
使用方法,大致如下
public class test {
public static Creator creator1,creator2;
public static Product product1,product2;
public static void main(String[] args){
creator1 = new ConcreteCreator1();
creator2 = new ConcreteCreator2();
product1 = creator1.factory();
product2 = creator2.factory();
product1.Say();
product2.Say();
}
}
生活中的设计模式

目前的生活,是一种快餐的生活。有时候不想做饭,去饭店也等不及,肯德基、麦当劳、德克士就成为了一种很方便的方式。
我们去肯德基,通常会吃点汉堡,点点可乐,不需要知道这些东西是怎么做出来的,直接点,拿到吃,简单方便,这就是生活中的快餐工厂。
通过一个MakeChoice方法,可以统一的进行选择。
interface KFC {
public Client working();
}
interface Client {
public void eating();
}
class Bread_Menu implements KFC {
public Client working() {
return new Client_Bread();
}
}
class Cola_Menu implements KFC {
public Client working() {
return new Client_Cola();
}
}
class Client_Bread implements Client {
public void eating() {
System.out.println("顾客 吃面包");
}
}
class Client_Cola implements Client {
public void eating() {
System.out.println("顾客 喝可乐");
}
}
public class FactoryMethodTest {
public static KFC waiter;
public static Client client1,client2;
public static KFC MakeChoice(KFC maker){
if(maker instanceof Bread_Menu){
return new Bread_Menu();
}else{
return new Cola_Menu();
}
}
public static void main(String[] args){
System.out.println("-------------想吃面包-----------------");
waiter = MakeChoice(new Bread_Menu());
client1= waiter.working();
client1.eating();
System.out.println("-------------想喝可乐-----------------");
waiter = MakeChoice(new Cola_Menu());
client2 = waiter.working();
client2.eating();
}
}
执行如下
-------------想吃面包-----------------
顾客 吃面包
-------------想喝可乐-----------------
顾客 喝可乐
【设计模式】——工厂方法FactoryMethod的更多相关文章
- 一天一个设计模式——工厂方法(FactoryMethod)模式
一.模式说明 在前一个模板方法(Template Method)模式中,父类定义了处理流程,而流程中用到的方法交给子类去实现.类似的,在工厂方法模式中,父类决定如何生成实例,但并不决定所要生成的具体类 ...
- 设计模式之工厂方法(FactoryMethod)模式
在五大设计原则的基础上经过GOF(四人组)的总结,得出了23种经典设计模式,其中分为三大类:创建型(5种).结构型(7种).行为型(11种).今天对创建型中的工厂方法(FactoryMethod)模式 ...
- 4. 星际争霸之php设计模式--工厂方法模式
题记==============================================================================本php设计模式专辑来源于博客(jymo ...
- C++设计模式——工厂方法模式
本文版权归果冻说所有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文链接,否则保留追究法律责任的权利.» 本文链接:http://www.jellythink.com/arch ...
- 工厂方法FactoryMethod 初步学习笔记
一,意图 定义一个用于创建对象的接口,让子类决定实例化哪一个类.工厂方法使一个类的实例化延迟到其子类. 二,别名 虚构造器 Virtual Constructor 三,适用性 当一个类不知道它 ...
- 设计模式-工厂方法模式(FactoryMethod)
简介: 简单工厂模式将类的示例化放在工厂对象中. 工厂方法模式是简单工厂模式的延伸,不同的是其将子类的实例化延迟到子类工厂中实现,本身仅定义一个创建对象的接口. 工厂方法模式主要由四部分组成: 1.抽 ...
- Java设计模式---工厂方法模式(Factory-Method)
一.普通工厂模式 建立一个工厂类,对实现了同一接口的一些类进行实例的创建 实例代码: 发送短信和邮件的例子,首先创建接口: public interface Sender { public void ...
- Python设计模式——工厂方法模式(FactoryMethod)
需求:有一个学雷锋活动,有买米和扫地两个内容,参与的人有大学生和社区志愿者,他们各自的方法不一样. 如果用简单工厂模式实现: #encoding=utf-8 __author__ = 'kevinlu ...
- 设计模式-工厂方法模式(FactoryMethod)
工厂方法模式又称多态工厂模式.工厂方法模式是定义一个创建产品对象的接口(FruitFactory),将具体创建工作给具体的实现类(AppFactory,BananaFactory,PearFactor ...
随机推荐
- (转)公有云vr客户端tcp连接数太多造成 系统卡顿问题 [bittorrent tracker优化] -公有云常见网络问题及思路
在公有云服务器 发现使用tcp(http)的tracker连接数太多 用户太多会造成windows系统卡顿 特此发表一下修改配置和路由器的方法 解决卡顿问题 解决方法1(参考内容): 修改 /etc/ ...
- AbelSu的区块链笔记
最近几年,像比特币.以太坊.ICO.区块链等概念突然成为互联网热门话题,今天写这篇博客,也是做一些笔记,大概说一下对这个的解释和其他相关内容. 区块链: 区块链是分布式数据存储.点对点传输.共识机制. ...
- 福慧双修&探险 BZOJ4398&BZOJ2407
分析: 双倍经验(数据范围不同). 我们考虑,我们必定是从1走一条边到节点i,之后从i到j跑最短路,之后再从j到1走另一条边的情况下,不会重复,并且是答案.那么我们考虑预处理出pre[i]表示从1走到 ...
- 避免写慢SQL
最近在整理数据库中的慢SQL,同时也查询了相关资料.记录一下,要学会使用执行计划来分析SQL. 1. 为查询缓存优化你的查询 大多数的MySQL服务器都开启了查询缓存.这是提高性最有效的方法之一,而且 ...
- 20155213免考项目——bof进阶及简易的HIDAttack
20155213免考项目--bof进阶及简易的HIDAttack 目录 序 任务一:构造Shellcode(64位) 任务二:64位Shellcode的注入 任务三:32位及64位bof攻击(开启堆栈 ...
- 20155232《网络对抗》Exp3 免杀原理与实践
20155232<网络对抗>Exp3 免杀原理与实践 问题回答 1.基础问题回答 (1)杀软是如何检测出恶意代码的? 基于特征码的检测 特征码:一段特征码就是一段或多段数据. 如果一个可执 ...
- Kafka查看topic、consumer group状态命令
最近工作中遇到需要使用kafka的场景,测试消费程序启动后,要莫名的过几十秒乃至几分钟才能成功获取到到topic的partition和offset,而后开始消费数据,于是学习了一下查看kafka br ...
- 用opencv实现工控机的开机录像
需要训练一个神经网络模型,可能需要用到很多视频数据,所以我想把手头的工控机设置为上电自启动,再借助opencv编译一个可执行文件,放在windows开机启动文件夹里,这样只要连接好摄像头和工控机以及电 ...
- tomcat-内存溢出java.lang.OutOfMemoryErrory:PermGen space解决方法
如果是PermGen space方法区内存溢出,可尝试加大MaxPermSize,如果是heap space 堆内存移除,可尝试修改Xmx 正常解决方法: 在注释下的第一行添加: JAVA_OPTS= ...
- 联想拯救者15-isk安装固态硬盘与系统迁移教程
一.固态选择 首先知道拯救者15-ISK是m.2接口2280尺寸,支持PCIE协议NVMe接口标准.我加装的固态是HP EX900系列250G M.2 NVMe固态硬盘. 二.开盖安装 1.拯救者15 ...