设计模式之抽象工厂模式
来源:互联网 发布:java变量定义规则 编辑:程序博客网 时间:2024/05/17 23:25
前言:
抽象工厂模式(Abstract Factory Pattern)是提供了一个创建一系列相关或相互依赖对象的接口,而无需指定它们具体的类。
一. 抽象工厂模式的简介:
优点:当一个产品族中的多个对象被设计成一起工作时,它能保证客户端始终只使用同一个产品族中的对象,方便切换产品系列。
缺点:产品族扩展非常困难,要增加一个系列的某一产品,既要在抽象的 Creator 里加代码,又要在具体的里面加代码。
二. 抽象工厂的实例:
实例:脸萌APP中,实现多款风格和不同性别头像的创建。
- UML类图模型:
2 .男女款式接口:
男孩款式:
package com.test.service.sex;/** * 男孩款式 * @author 葫芦娃 * */public interface Boy { public void drawMan();}
女孩款式:
package com.test.service.sex;/** * 女孩款式 * @author 葫芦娃 * */public interface Girl { public void drawWomen();}
3 .产品类:
新年风格男款类:
package com.test.impl.product;import com.test.service.sex.Boy;/** * 新年风格男款 * @author 葫芦娃 * */public class HNBoy implements Boy { @Override public void drawMan() { System.out.println("-----------------新年风格男款--------------------"); }}
新年风格女款类:
package com.test.impl.product;import com.test.service.sex.Girl;/** * 新年风格女款 * @author 葫芦娃 * */public class HNGirl implements Girl { @Override public void drawWomen() { System.out.println("-----------------新年风格女款--------------------"); }}
圣诞风格男款类:
package com.test.impl.product;import com.test.service.sex.Boy;/** * 圣诞风格男款 * @author 葫芦娃 * */public class MCBoy implements Boy { @Override public void drawMan() { System.out.println("-----------------圣诞风格男款--------------------"); }}
圣诞风格女款类:
package com.test.impl.product;import com.test.service.sex.Girl;/** * 圣诞风格女款 * @author 葫芦娃 * */public class MCGirl implements Girl { @Override public void drawWomen() { System.out.println("-----------------圣诞风格女款--------------------"); }}
4 .人物抽象工厂类
package com.test.service.factory;import com.test.service.sex.Boy;import com.test.service.sex.Girl;/** * 人物的实现接口 * @author 葫芦娃 * */public interface PersonFactory { //男孩接口 public Boy getBoy(); //女孩接口 public Girl getGirl();}
5 . 两种主题风格的工厂类
新年风格工厂类:
package com.test.service.holiday;import com.test.impl.product.HNBoy;import com.test.impl.product.HNGirl;import com.test.service.factory.PersonFactory;import com.test.service.sex.Boy;import com.test.service.sex.Girl;/** * 新年风格工厂(Happy NewYear Factory) * @author 葫芦娃 * */public class HNFactory implements PersonFactory { @Override public Boy getBoy() { return new HNBoy(); } @Override public Girl getGirl() { return new HNGirl(); }}
圣诞风格工厂:
package com.test.service.holiday;import com.test.impl.product.MCBoy;import com.test.impl.product.MCGirl;import com.test.service.factory.PersonFactory;import com.test.service.sex.Boy;import com.test.service.sex.Girl;/** * 圣诞风格工厂(Merry Christmas Factory) * @author 葫芦娃 * */public class MCFctory implements PersonFactory { @Override public Boy getBoy() { return new MCBoy(); } @Override public Girl getGirl() { return new MCGirl(); }}
6 . 客户端:
package com.test.client;import com.test.service.factory.PersonFactory;import com.test.service.holiday.HNFactory;import com.test.service.holiday.MCFctory;import com.test.service.sex.Boy;import com.test.service.sex.Girl;/** * 客户端 * @author 葫芦娃 * */public class Client { public static void main(String[] args){ PersonFactory factory1 = new HNFactory(); Boy boy1 = factory1.getBoy(); boy1.drawMan(); Girl girl1 = factory1.getGirl(); girl1.drawWomen(); PersonFactory factory2 = new MCFctory(); Boy boy2 = factory2.getBoy(); boy2.drawMan(); Girl girl2 = factory2.getGirl(); girl2.drawWomen(); }}
- 运行结果:
-----------------新年风格男款-------------------------------------新年风格女款-------------------------------------圣诞风格男款-------------------------------------圣诞风格女款--------------------
三. 总结:
抽象工厂的优点:
1. 像PersonFactory factory1 = new HNFactory(),在一个应用中初始化的时候只会出现一次,改变一个具体工厂变得容易,只需要改变具体的工厂,就可以使用不同的产品配置。
2. 让创建实例的过程与客户端分离,客户端通过它们的抽象接口,操纵实例,产品的具体类名也被工厂分离,不会出现在,客户端代码中。
抽象工厂的缺点:抽象工厂方便切换产品系列,却在新增功能时候,却需要更改三个工厂类,代码改动太大。
阅读全文
1 0
- 设计模式之抽象工厂
- 设计模式 之 抽象工厂
- 设计模式之抽象工厂
- 设计模式之抽象工厂
- 设计模式之抽象工厂
- 设计模式之抽象工厂
- 设计模式之抽象工厂
- 设计模式之抽象工厂
- 设计模式之抽象工厂
- 设计模式之抽象工厂
- 设计模式之-抽象工厂
- 设计模式之抽象工厂
- 设计模式之抽象工厂
- 设计模式 之 抽象工厂
- 设计模式之抽象工厂
- 设计模式之抽象工厂
- 设计模式之抽象工厂
- 设计模式之抽象工厂
- 单链表的头插法和尾插法
- sql server存储过程实例
- Oracle之Hint使用总结
- 女孩有个作家梦
- [Unity3D]-Unity与Android交互
- 设计模式之抽象工厂模式
- python脚本利用windows计划定时执行
- webpack使用优化
- <NOIP> 11 . P1424 小鱼的航程(改进版)
- dl4mt:lstm语言模型训练,代码讲解
- Django+Jquery+Ajax+验证码登录案例系列之十二
- QT常用控件之QTimer,QDialog,QLabel,QLineEdit,QProgressBar,QComboBox,QPushButton,QGridLayout
- 20170630
- Deep Learning(深度学习)学习笔记整理系列之(一)