工厂方法模式

工厂方法模式是我们开发中使用最广泛的设计模式之一,不说无聊的定义,直接看例子

一、工厂方法模式的四大模块:

1、抽象工厂 --- 一个抽象类,有一个生产产品(女朋友)的抽象方法,由具体工厂实现。

2、具体工厂 --- 继承抽象工厂类,生产何种产品(你是要国产还是要日韩还是要欧美由你定)的具体实现。

3、抽象产品 --- 一个抽象类,提供一个抽象方法,由具体产品实现。

4、具体产品 -- 哈哈,你懂的。

以上解释看不懂?没关系,看代码:

二、工厂方法模式的通用代码

1、抽象工厂类

//抽象工厂
public abstract class Factory {public abstract Product createProduct();
}    复制代码

2、具体工厂

public class ProductFactory extends Factory {@Overridepublic Product createProduct() {return new GirlFriendProduct();//return new BoyFriendProduct();}
}复制代码

3、抽象产品

public abstract class Product {public abstract void createProduct();}复制代码

4、具体的产品

 //生产女朋友public class GirlFriendProduct extends Product {@Overridepublic void createProduct() {System.out.println("product======冰冰");}
}    //生产男朋友
public class BoyFriendProduct extends Product{@Overridepublic void createProduct() {System.out.println("product======小鲜肉");}
} 复制代码

接下来看看在代码中的使用

 public class FactoryActivity extends AppCompatActivity {private Product mProduct;private Factory mFactory;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_factory);mFactory = new ProductFactory();mProduct = mFactory.createProduct();}//生产一个朋友public void clickCreate(View view) {mProduct.createProduct();}
}复制代码

点击按钮,生产一个朋友,看看控制台日志输出:

 product======冰冰复制代码

好了,到此为止,一个通用的工厂方法模式的代码就写完了。不过可能有人说了,老子喜欢男的啊,这也好办啊,你在ProductFactory类里,返回 BoyFriendProduct 就行了(参见注释掉的代码),这时你再生产一个朋友看看,控制台输出如下:

 product======小鲜肉复制代码

好了,大胸弟,你要的小鲜肉也有了,尽情的去玩耍吧。

这时比较常见的方式,你需要女朋友就生产女朋友,反之你就生产男朋友,其实还可以通过泛型来简化一下代码,改造后的代码如下:

 //抽象工厂 具体生产什么产品由子类实现
public abstract class Factory {public abstract <T extends Product> T createProduct(Class<T> clz);
} 复制代码

具体工厂:

 //具体工厂public class ProductFactory extends Factory {@Override
public <T extends Product> T createProduct(Class<T> clz) {Product product = null;try {product = (Product) Class.forName(clz.getName()).newInstance();} catch (Exception e) {e.printStackTrace();}return (T) product;
}
}复制代码

此时再看看在代码中的使用,这时你只需根据你需要的product传入相应的类就哦了:

mFactory = new ProductFactory();
mProduct = mFactory.createProduct(BoyFriendProduct.class);mProduct.createProduct();复制代码

以上通过泛型和反射简化了代码,不过假如我们的工厂只生产一种产品的时候(比如只生产女朋友),我们还可以再简化一下代码,我们可以把factory改为普通的类(非抽象),然后在factory类里直接返回产品并把方法改为静态即可,这样的方式又称为简单工厂模式。

 public static Product createProduct(){return new GirlFriendProduct();
}复制代码

PS:工厂设计模式是一个很好的设计模式,它的缺点是每当工厂添加一个产品时(比如还能生产苍老师,哈哈),我们要新编写一个相应的产品类,在实际的开发中,可以根据实际情况自行选择吧。

最后,生产女朋友讲完了,下一篇会讲一下 带你勾搭妹子的职责连模式,欢迎关注,谢谢。

本篇项目demo地址,欢迎start

https://github.com/lxykad/design_mode复制代码

设计模式:给你生产一个女朋友---工厂方法模式相关推荐

  1. 深入浅出设计模式四——比萨店生产比萨实现(工厂方法模式)

    在http://quicker.iteye.com/blog/571714一文中已经讲了简单工厂和工厂方法并且有UML图和实现的代码. 这里只结合实例分析一下工厂方法在实际生活中的应用. 我们看看比萨 ...

  2. java/android 设计模式学习笔记(3)---工厂方法模式

    这篇来介绍一下工厂方法模式(Factory Method Pattern),在实际开发过程中我们都习惯于直接使用 new 关键字用来创建一个对象,可是有时候对象的创造需要一系列的步骤:你可能需要计算或 ...

  3. 设计模式来一发(三)工厂方法模式

    1.定义 为某个对象提供一个接口,而且无需指定它们的具体类. 工厂方法模式,是简单工厂模式的延伸(https://blog.csdn.net/ss1300460973/article/details/ ...

  4. [Python设计模式] 第8章 学习雷锋好榜样——工厂方法模式

    github地址:https://github.com/cheesezh/python_design_patterns 简单工厂模式 v.s. 工厂方法模式 以简单计算器为例,对比一下简单工厂模式和工 ...

  5. 设计模式系列漫谈之二 - 工厂方法模式

    故事       10月1日是小雪的生日.许多追求者都想在生日那天给小雪一份意想不到的惊喜,并且表达自己的爱意.这些追求者绞尽脑汁的为小雪发送一个比较有创意的祝福短信.看来,小雪今年的生日过得肯定非常 ...

  6. JAVA设计模式是个什么玩意儿_01_工厂方法模式

    1. 前言 工厂方法模式(Factory Method) 该模式属于创建型设计模式. 2. 定义 摘自<研磨设计模式> 陈臣.王斌 3.代码举例 public interface BMW ...

  7. 大话设计模式读书 笔记(六) 工厂方法模式

    工厂方法模式(Factory Method) 书中通过一个学雷锋的例子,来引出工厂方法模式. 工厂方法模式:定义了一个用于创建对象的接口,让子类决定实例化哪一个类.工厂方法使一个类的实例化延迟到其子类 ...

  8. 设计模式之(Factory method)工厂方法模式

    1.需求 开发一个测试工具专门用于测试手机,测试流程打开分为以下几步:测试开机速度->测试屏幕亮度->测试相机效果.手机有很多种品牌:三星.小米.魅族等等. 2. 分析 不同的手机的测试流 ...

  9. 设计模式——工厂模式(简单工厂模式、工厂方法模式、抽象工厂模式)

    声明: 本博客参考C语言中文网:C语言中文网连接 主要记录学习以下内容: 一.简单工厂模式 二.工厂方法模式 三.抽象工厂模式 每个大要点都主要包括以下两部分内容: (1)基本概念和模型结构(包括一些 ...

最新文章

  1. Mysql5.7的gtid主从半同步复制和组复制
  2. python多核多线程编程_python是否支持多处理器/多核编程?
  3. CSS3定位和浮动详解
  4. Python与C语言的区别是什么?
  5. Linux的实际操作:文件目录类的实用指令(帮助指令 man help)
  6. PHP地图规划骑行路径,骑行路线规划-路线规划-开发指南-iOS 导航SDK | 高德地图API...
  7. db2官方SQLSTATE代码提示
  8. 工作组下安装ISA Server 2004
  9. 负熵主义者_未来主义者
  10. No module named ‘lightgbm‘
  11. NDK crash分析方法
  12. 9.5 用算法和数学奠定专业基础——《逆袭大学》连载
  13. python span函数_如何使用python selenium单击span元素
  14. 我的一些关于职场和职业发展的心得
  15. Java中的Constants类
  16. 关于RedisPool配置参数
  17. #DNS比较(北京联通宽带) @FDDLC
  18. python 两个word文档之间的相似度_如何用 word2vec 计算两个句子之间的相似度?
  19. python如何画点_python matplotlib 如何画点 而不要画点之间的连线?
  20. 主成分分析(Principal Component Analysis,PCA)

热门文章

  1. [Ext JS]treelist实现tooltip
  2. [Spring Boot核心功能]1. SpringApplication 启动引导类(1)
  3. 12.12 带触发器按钮的输入框
  4. Spring boot Rabbitmq 示例
  5. java 国际象棋 中文版_卡尔波夫国际象棋豪华版
  6. 2120: 数颜色(带修莫队)
  7. php+ajax+js注册源码,将Ajax封装至js文件中(用户注册源码实例)
  8. spring配合Junit进行单元测试
  9. shell使用sshpass自动验证root密码
  10. 第七章 ---- 异常处理