设计模式:给你生产一个女朋友---工厂方法模式
工厂方法模式
工厂方法模式是我们开发中使用最广泛的设计模式之一,不说无聊的定义,直接看例子
一、工厂方法模式的四大模块:
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复制代码
设计模式:给你生产一个女朋友---工厂方法模式相关推荐
- 深入浅出设计模式四——比萨店生产比萨实现(工厂方法模式)
在http://quicker.iteye.com/blog/571714一文中已经讲了简单工厂和工厂方法并且有UML图和实现的代码. 这里只结合实例分析一下工厂方法在实际生活中的应用. 我们看看比萨 ...
- java/android 设计模式学习笔记(3)---工厂方法模式
这篇来介绍一下工厂方法模式(Factory Method Pattern),在实际开发过程中我们都习惯于直接使用 new 关键字用来创建一个对象,可是有时候对象的创造需要一系列的步骤:你可能需要计算或 ...
- 设计模式来一发(三)工厂方法模式
1.定义 为某个对象提供一个接口,而且无需指定它们的具体类. 工厂方法模式,是简单工厂模式的延伸(https://blog.csdn.net/ss1300460973/article/details/ ...
- [Python设计模式] 第8章 学习雷锋好榜样——工厂方法模式
github地址:https://github.com/cheesezh/python_design_patterns 简单工厂模式 v.s. 工厂方法模式 以简单计算器为例,对比一下简单工厂模式和工 ...
- 设计模式系列漫谈之二 - 工厂方法模式
故事 10月1日是小雪的生日.许多追求者都想在生日那天给小雪一份意想不到的惊喜,并且表达自己的爱意.这些追求者绞尽脑汁的为小雪发送一个比较有创意的祝福短信.看来,小雪今年的生日过得肯定非常 ...
- JAVA设计模式是个什么玩意儿_01_工厂方法模式
1. 前言 工厂方法模式(Factory Method) 该模式属于创建型设计模式. 2. 定义 摘自<研磨设计模式> 陈臣.王斌 3.代码举例 public interface BMW ...
- 大话设计模式读书 笔记(六) 工厂方法模式
工厂方法模式(Factory Method) 书中通过一个学雷锋的例子,来引出工厂方法模式. 工厂方法模式:定义了一个用于创建对象的接口,让子类决定实例化哪一个类.工厂方法使一个类的实例化延迟到其子类 ...
- 设计模式之(Factory method)工厂方法模式
1.需求 开发一个测试工具专门用于测试手机,测试流程打开分为以下几步:测试开机速度->测试屏幕亮度->测试相机效果.手机有很多种品牌:三星.小米.魅族等等. 2. 分析 不同的手机的测试流 ...
- 设计模式——工厂模式(简单工厂模式、工厂方法模式、抽象工厂模式)
声明: 本博客参考C语言中文网:C语言中文网连接 主要记录学习以下内容: 一.简单工厂模式 二.工厂方法模式 三.抽象工厂模式 每个大要点都主要包括以下两部分内容: (1)基本概念和模型结构(包括一些 ...
最新文章
- Mysql5.7的gtid主从半同步复制和组复制
- python多核多线程编程_python是否支持多处理器/多核编程?
- CSS3定位和浮动详解
- Python与C语言的区别是什么?
- Linux的实际操作:文件目录类的实用指令(帮助指令 man help)
- PHP地图规划骑行路径,骑行路线规划-路线规划-开发指南-iOS 导航SDK | 高德地图API...
- db2官方SQLSTATE代码提示
- 工作组下安装ISA Server 2004
- 负熵主义者_未来主义者
- No module named ‘lightgbm‘
- NDK crash分析方法
- 9.5 用算法和数学奠定专业基础——《逆袭大学》连载
- python span函数_如何使用python selenium单击span元素
- 我的一些关于职场和职业发展的心得
- Java中的Constants类
- 关于RedisPool配置参数
- #DNS比较(北京联通宽带) @FDDLC
- python 两个word文档之间的相似度_如何用 word2vec 计算两个句子之间的相似度?
- python如何画点_python matplotlib 如何画点 而不要画点之间的连线?
- 主成分分析(Principal Component Analysis,PCA)
热门文章
- [Ext JS]treelist实现tooltip
- [Spring Boot核心功能]1. SpringApplication 启动引导类(1)
- 12.12 带触发器按钮的输入框
- Spring boot Rabbitmq 示例
- java 国际象棋 中文版_卡尔波夫国际象棋豪华版
- 2120: 数颜色(带修莫队)
- php+ajax+js注册源码,将Ajax封装至js文件中(用户注册源码实例)
- spring配合Junit进行单元测试
- shell使用sshpass自动验证root密码
- 第七章 ---- 异常处理