前言:【模式总览】——————————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的更多相关文章

  1. 一天一个设计模式——工厂方法(FactoryMethod)模式

    一.模式说明 在前一个模板方法(Template Method)模式中,父类定义了处理流程,而流程中用到的方法交给子类去实现.类似的,在工厂方法模式中,父类决定如何生成实例,但并不决定所要生成的具体类 ...

  2. 设计模式之工厂方法(FactoryMethod)模式

    在五大设计原则的基础上经过GOF(四人组)的总结,得出了23种经典设计模式,其中分为三大类:创建型(5种).结构型(7种).行为型(11种).今天对创建型中的工厂方法(FactoryMethod)模式 ...

  3. 4. 星际争霸之php设计模式--工厂方法模式

    题记==============================================================================本php设计模式专辑来源于博客(jymo ...

  4. C++设计模式——工厂方法模式

    本文版权归果冻说所有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文链接,否则保留追究法律责任的权利.» 本文链接:http://www.jellythink.com/arch ...

  5. 工厂方法FactoryMethod 初步学习笔记

    一,意图   定义一个用于创建对象的接口,让子类决定实例化哪一个类.工厂方法使一个类的实例化延迟到其子类. 二,别名   虚构造器 Virtual Constructor 三,适用性 当一个类不知道它 ...

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

    简介: 简单工厂模式将类的示例化放在工厂对象中. 工厂方法模式是简单工厂模式的延伸,不同的是其将子类的实例化延迟到子类工厂中实现,本身仅定义一个创建对象的接口. 工厂方法模式主要由四部分组成: 1.抽 ...

  7. Java设计模式---工厂方法模式(Factory-Method)

    一.普通工厂模式 建立一个工厂类,对实现了同一接口的一些类进行实例的创建 实例代码: 发送短信和邮件的例子,首先创建接口: public interface Sender { public void ...

  8. Python设计模式——工厂方法模式(FactoryMethod)

    需求:有一个学雷锋活动,有买米和扫地两个内容,参与的人有大学生和社区志愿者,他们各自的方法不一样. 如果用简单工厂模式实现: #encoding=utf-8 __author__ = 'kevinlu ...

  9. 设计模式-工厂方法模式(FactoryMethod)

    工厂方法模式又称多态工厂模式.工厂方法模式是定义一个创建产品对象的接口(FruitFactory),将具体创建工作给具体的实现类(AppFactory,BananaFactory,PearFactor ...

随机推荐

  1. liMarquee – jQuery无缝滚动插件(制作跑马灯效果)

    liMarquee 是一款基于 jQuery 的无缝滚动插件,类似于 HTML 的 marquee 标签,但比 marquee 更强大.它可以应用于任何 Web 元素,包括文字.图像.表格.表单等元素 ...

  2. Mike的农场 BZOJ4177

    分析: 最小割,不选则割的建模题...(然而一开始我当成了费用流,简直丧心病狂...最后想到了最小割...) 对于条件一,直接建一条双向边就可以了,并且不计入sum中,因为这是作为费用的存在,让它跑出 ...

  3. 20155218 《网络对抗技术》 MAL_恶意代码分析

    20155218 <网络对抗技术> MAL_恶意代码分析 实验内容: 1.使用schtasks指令监控系统运行 1.在C盘下新建一个文本文档,输入一下内容后,更名为netstatlog.b ...

  4. 20155226《网络攻防》 Exp3 免杀原理与实践

    20155226<网络攻防> Exp3 免杀原理与实践 实验过程 1. msfvenom直接生成meterpreter可执行文件 直接将上周做实验时用msf生成的后门文件放在virscan ...

  5. springboot的热部署和dubug

    采用了项目聚合,产生一些不同,遇到的问题和解决方法分享下. 项目结构: rebuilder2 -htran 主项目 -htran-api 1.htran.pom <parent> < ...

  6. EZ 2018 03 09 NOIP2018 模拟赛(三)

    最近挺久没写比赛类的blog了 链接:http://211.140.156.254:2333/contest/59 这次的题目主要考验的是爆搜+打表的能力 其实如果你上来就把所有题目都看过一次就可以知 ...

  7. [Oracle]如果误删了某个数据文件,又没有被备份,能否恢复?

    如果你有从这个数据文件创建之前,直到现在的,所有的ArchiveLog 和 Online REDO,是有可能进行恢复的. 执行: RMAN> restore datafile <filei ...

  8. Hadoop日记Day9---HDFS的java访问接口

    一.搭建Hadoop 开发环境 我们在工作中写完的各种代码是在服务器中运行的,HDFS 的操作代码也不例外.在开发阶段,我们使用windows 下的eclipse 作为开发环境,访问运行在虚拟机中的H ...

  9. CS229笔记:分类与逻辑回归

    逻辑回归 对于一个二分类(binary classification)问题,\(y \in \left\{0, 1\right\}\),如果直接用线性回归去预测,结果显然是非常不准确的,所以我们采用一 ...

  10. banner 跟随鼠标呈现视差效果

    参考 Element 官网,利用 js / jq 和 css3, 实现某图片随着鼠标移动呈现的视差效果. <!DOCTYPE html> <html> <head> ...