博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
【设计模式】——工厂方法FactoryMethod
阅读量:6271 次
发布时间:2019-06-22

本文共 3051 字,大约阅读时间需要 10 分钟。

hot3.png

  前言:【】——————————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();    }}

  执行如下

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

 

转载于:https://my.oschina.net/u/204616/blog/545301

你可能感兴趣的文章
第三百二十七节,web爬虫讲解2—urllib库爬虫—基础使用—超时设置—自动模拟http请求...
查看>>
MVC总结--MVC简单介绍以及和WebForm差别
查看>>
tiny4412 裸机程序 五、控制icache【转】
查看>>
VB.NET多线程入门
查看>>
国外物联网平台初探(二) ——微软Azure IoT
查看>>
findlibrary returned null产生的联想,Android ndk开发打包时我们应该怎样注意平台的兼容(x86,arm,arm-v7a)...
查看>>
Android事件分发机制源代码分析
查看>>
《设计模式》结构型模式
查看>>
[javase学习笔记]-8.3 statickeyword使用的注意细节
查看>>
Spring集成RabbitMQ-使用RabbitMQ更方便
查看>>
Nginx 设置域名转向配置
查看>>
.net core 实现简单爬虫—抓取博客园的博文列表
查看>>
FP-Tree算法的实现
查看>>
Android 用Handler和Message实现计时效果及其中一些疑问
查看>>
Dos命令删除添加新服务
查看>>
C#.NET常见问题(FAQ)-索引器indexer有什么用
查看>>
hadoop YARN配置参数剖析—MapReduce相关参数
查看>>
Java 正则表达式详细使用
查看>>
【ADO.NET】SqlBulkCopy批量添加DataTable
查看>>
SqlServer--bat批处理执行sql语句1-osql
查看>>