【设计模式】——工厂方法FactoryMethod

  前言:【模式总览】——————————by xingoo

  模式意图

  工厂方法在MVC中应用的很广泛。

  工厂方法意在分离产品与创建的两个层次,使用户在一个工厂池中可以选择自己想要使用的产品,而忽略其创建过程。

  简单来说,就像一个大型的工厂,对于消费者来说,只需要知道都有什么工厂的产品生产出来,而不需要关心工厂是如何生产产品的。对于工厂来说,必须知道所有的产品的制造方法。

  模式结构

  Creator 创建工厂的接口

  ConcreteCreator 具体的产品创建者

  Product 产品的接口

  ConcreteProduct 具体的产品

  适合场景

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

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

  3 当类创建对象的职责委托给多个帮助子类中的某一个,并且希望进行一些信息的局部初始化的时候。

  代码结构

  工厂方法需要一个工厂接口,提供了基本的类模式,和一个产品接口,提供基本的方法。

1 interface Creator{
2     public Product factory();
3 }
4 interface Product{
5     public void Say();
6 }

  接下来就是具体的工厂方法,可以创建不同的产品。

 1 class ConcreteCreator1 implements Creator{
 2     public Product factory() {
 3         return new ConcreteProduct1();
 4     }
 5 }
 6 class ConcreteCreator2 implements Creator{
 7     public Product factory() {
 8         return new ConcreteProduct2();
 9     }
10 }

  其次需要不同的产品。

 1 class ConcreteProduct1 implements Product{
 2     public void Say() {
 3         System.out.println("ConcreteProduct1");
 4     }
 5 }
 6 class ConcreteProduct2 implements Product{
 7     public void Say() {
 8         System.out.println("ConcreteProduct2");
 9     }
10 }

  使用方法,大致如下

 1 public class test {
 2     public static Creator creator1,creator2;
 3     public static Product product1,product2;
 4     public static void main(String[] args){
 5         creator1 = new ConcreteCreator1();
 6         creator2 = new ConcreteCreator2();
 7         
 8         product1 = creator1.factory();
 9         product2 = creator2.factory();
10         
11         product1.Say();
12         product2.Say();
13     }
14 }

  生活中的设计模式

  目前的生活,是一种快餐的生活。有时候不想做饭,去饭店也等不及,肯德基、麦当劳、德克士就成为了一种很方便的方式。

  我们去肯德基,通常会吃点汉堡,点点可乐,不需要知道这些东西是怎么做出来的,直接点,拿到吃,简单方便,这就是生活中的快餐工厂。

  通过一个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();
    }
}

  执行如下

-------------想吃面包-----------------
顾客 吃面包
-------------想喝可乐-----------------
顾客 喝可乐

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏积累沉淀

分享一个flash播放音乐的类

//定义数组 var myXML = new XML(); var mp3total = new Array(); var mp3name = new Arra...

21390
来自专栏IT派

细思极恐-你真的会写java吗?

自2013年毕业后,今年已经是我工作的第4个年头了,总在做java相关的工作,终于有时间坐下来,写一篇关于java写法的一篇文章,来探讨一下如果你真的是一个ja...

19850
来自专栏码代码的陈同学

异常处理的反模式

异常设计实践 中有位读者评论:又记录日志又抛异常反模式设计。其实我并不知道反模式,本文是对于反模式的学习整理,数据都来自参考资料。

17750
来自专栏程序人生

重构:撰写合格的代码

在「代码重构之道」里,我犯了个懒,讨论了什么情况下需要考虑重构,以及工具和方法来促进重构,但对如何重构代码本身,或者说:如何把烂代码转化成好代码,或者至少是合格...

37380
来自专栏程序员的诗和远方

20180708_ARTS_week02

Add Two Numbers You are given two non-empty linked lists representing two non-ne...

7010
来自专栏三木的博客

Kobject浅析

面向对象的思想的确在应用软件的开发中颇具优势,它让一个个纯逻辑的函数和数据变成了一个个有生命的个体。鉴于性能的考虑,系统软件的实现(例如linux kernel...

22180
来自专栏FreeBuf

分析无线遥控器信号并制作Hack硬件进行攻击

*原创作者:ZMOM1031,本文属FreeBuf原创奖励计划,未经许可禁止转载 ? 无线遥控器(无线电遥控器)在我们生活中非常常见,应用于各种场景,方...

29380
来自专栏WeTest质量开放平台团队的专栏

有的UE画不好PPT,好的测试却靠Python加薪

                 测试开发者的共同关注! 作者:jhouyang,腾讯资深后台开发工程师。 WeTest导读 想要升职加薪,强大的专业能力很...

17340
来自专栏圣杰的专栏

DDD理论学习系列(7)-- 值对象

? 1.引言 提到值对象,我们可能立马就想到值类型和引用类型。而在C#中,值类型的代表是strut和enum,引用类型的代表是class、interface、...

30070
来自专栏数据结构与算法

2017.5.20欢(bei)乐(ju)赛解题报告

预计分数:100+20+50=first 实际分数:20+0+10=gg 水灾(sliker.cpp/c/pas) 1000MS  64MB 大雨应经下了几天雨...

31370

扫码关注云+社区

领取腾讯云代金券