设计模式_1_工厂模式与抽象工厂

工厂模式

工厂模式(创建型模式):创建对象接口,让其子类自己决定实例化哪一个工厂类,工厂模式使其创建延伸到子类进行
主要解决接口选择问题,明确计划不同条件下执行创建不同实例
通过子类实现工厂实例,创建过程在其子类执行
优点:提高扩展性,屏蔽产品具体实现,调用者只关心产品接口;
缺点:增加一个产品,会导致系统中类个数增加,造成系统复杂度
使用场景:

		1.日志记录:用户选择将日志记录到磁盘/系统事件/远程服务器2.数据库访问:系统采用不同的数据库3.设计连接服务器的框架, 比如针对pop3, imap, http设计接口
注:工厂模式作为类的创建模式, 复杂的对象使用工厂模式, 简单对象使用new, 而非工厂模式

简单工厂:一个工厂类,一个产品抽象类
工厂方法:多个工厂类,一个产品抽象类
抽象工厂:多个工厂类,多个产品抽象类

个人思考:

采用松耦合,多态的方式,使得我想要哪一个功能,就生成相应对象
问题的考虑方向只需放在要实例化哪个类,要增加哪一项功能也可以使用枚举的方式
实现工厂模式: 将每个工厂实例作为枚举对象,通过枚举工厂进行调用

抽象工厂

抽象工厂模式(创建型模式,其他工厂的工厂):
接口只负责创建一个相关的对象的工厂,不需要显式指定类,工厂模式就能按照工厂模式提供对象(多态)
用于解决接口选择问题
优点:当产品族中,多个对象被设计成一起工作,能保证客户端只使用一个产品族中对象
缺点:产品族中扩展产品,需要在抽象类中添加代码, 还需要在具体实现里面添加代码
个人思考:

		1. 懂得一点,使用设计模式, 先搞定UML2. 建立多个工厂, 然后建立一个总的工厂,通过总的工厂调用下属工厂3. 主要还是多态的性质运用, 程序中还有很多瑕疵4. 主要还是接口的选择, 以及状态的变化

下面给出例子说明抽象工厂与工厂模式:

package com.AbstractFactory;
/*** 懂得一点,使用设计模式, 先搞定UML* 建立多个工厂, 然后建立一个总的工厂,通过总的工厂调用下属,* 主要还是多态的性质运用, 程序中还有很多瑕疵* 主要还是接口的选择, 以及状态的变化* @author regotto**/
public class AbstractFactoryDemo1 {public static void main(String[] args) {// 获得图像工厂AbstractFactoryShapeColor shapefactory=FactoryProducer1.getFactory("Shape");// 根据目标图像绘制对应的图案shapefactory.getShape("Rectangle").draw();// 获得颜色工厂AbstractFactoryShapeColor colorfactory=FactoryProducer1.getFactory("Color");//根据需要的颜色给对应的图像做颜色填充colorfactory.getColor("Red").fill();;}}//使用工厂
class FactoryProducer1{public static AbstractFactoryShapeColor getFactory(String FactoryType) {if(FactoryType==null) return null;else if(FactoryType.equals("Shape"))return new ShapeFactory();else if(FactoryType.equals("Color"))return new ColorFactory();else return null;}
}//抽象工厂
abstract class AbstractFactoryShapeColor{public abstract Shape getShape(String shapeType);public abstract Color getColor(String colorType);
}//Shape工厂
class ShapeFactory extends AbstractFactoryShapeColor{public Shape getShape(String shapeType) {if(shapeType==null)return null;if(shapeType.equals("Rectangle"))return new Rectangle();else if(shapeType.equals("Square"))return new Square();else if(shapeType.equals("Circle"))return new Circle();else return null;}@Overridepublic Color getColor(String colorType) {// TODO Auto-generated method stubreturn null;}
}//Color工厂
class ColorFactory extends AbstractFactoryShapeColor{public Shape getShape(String shapeType) {if(shapeType==null)return null;if(shapeType.equals("Rectangle"))return new Rectangle();else if(shapeType.equals("Square"))return new Square();else if(shapeType.equals("Circle"))return new Circle();else return null;}@Overridepublic Color getColor(String colorType) {if(colorType==null)return null;if(colorType.equals("Red"))return new Red();else if(colorType.equals("Bule"))return new Blue();else if(colorType.equals("Green"))return new Green();else return null;}
}//Shape属性
interface Shape{void draw();
}
class Rectangle implements Shape{public void draw() {System.out.println("Rectangle");	}
}
class Square implements Shape{public void draw() {System.out.println("Square");	}
}
class Circle implements Shape{public void draw() {System.out.println("Circle");	}
}//Color属性
interface Color{void fill();
}
class Red implements Color{public void fill() {System.out.println("Red");}
}
class Blue implements Color{public void fill() {System.out.println("Blue");}
}
class Green implements Color{public void fill() {System.out.println("Green");}
}

代码中分别建立了两个工厂—color以及shape, 实现顶级抽象父类AbstractFactoryShapeColor, 最后新建一个实体工厂分别获得color以及shape两个工厂, 通过AbstractFactoryShapeColor的引用分别调用draw和fill方法对图像的绘制和颜色的填充
体现了多个工厂, 多个抽象产品, 获得抽象产品的方式延伸到子类中进行

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/468713.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

android 7.1 apk的systemuid相同导致问题[2]

1上周发的一篇文章《android 7.1 apk的systemuid和系统应用Setting相同导致开机找不到库的问题》,然后有个小伙伴找我讨论了,觉得自己的脑洞了打开了很多,所以针对这个问题再次做一次总结,如果大家有好的建议也可以在文末留言。2先…

uasset python_Unreal Python 结合 C++ 开发蓝图库插件

本文章转载自 智伤帝的个人博客 - 原文链接前言上个月的这个时候我写了一篇文章关于如何嵌入 PySide 调用 Qt 的 GUI 开发。 链接Python 虽然很好,但是有些功能,并没有从 C 里面暴露出来。这种情况就需要通过 C 的蓝图开发来将这部分的功能进行暴露。这样…

设计模式_2_单例模式

单例模式 单例模式(创建型模式): 涉及到的单一的类,该类只负责自己对象的创建,并且只有单个对象被创建,提供唯一的对象访问方式,可直接访问 注: 只能有一个实例作为全局的访问点, 构造函数私有单例类只能自己创建自己唯一的实例, 必须给所有其他对象提供这一实例; !!!使用syn…

送书送书送书,(包邮)送,仅此而已!

亲爱的各位fans们,大家好,这次小编联合5个公众号朋友一起送书,一共送出 6本,当然包邮!感谢本次活动的赞助商北京大学出版社。6个公众号联合送书,一共6本书,每个公众号送1本(包邮)。 6个公众号同…

Java多线程_1_Java内存模型_内存模型的3大特性

Java内存模型: 内存分布情况及其关系: 主内存:Java内存模型规定所有的变量都保存在主内存中 工作内存:每个线程都有自己的工作内存,保存了该线程使用到的变量的主内存副本拷贝 主内存与工作内存的关系: 线程对变量的所有操作都必须在自己的工作内存中进行,不能直接读写主内存…

requests 获取div_爬虫系列第五篇 使用requests与BeautifulSoup爬取豆瓣图书Top250

上一篇我们学习了BeautifulSoup的基本用法,本节我们使用它来爬取豆瓣图书Top250。一、网页分析我们爬取的网页的url是https://book.douban.com/top250?icnindex-book250-all。首页如图与豆瓣电影Top250差不多,将页面拉到最底部,可以看到分页…

python--socket套接字/TCP

socket套接字/TCP 一 客户端/服务器架构 C/S架构,包括 硬件C/S架构(打印机)软件C/S 架构(web服务)C/S架构的软件(软件属于应用层)是基于网络进行通信的Server端要: 1.力求一直提供服…

uniapp封装网络请求_八张图带你走进“通过一个完美请求封装一个网络模块”

本文提供视频课程讲解,需要的小伙伴可以点赞私信‘’网络模块‘’前往领取学习大纲1、网络模块在应用中的地位1.1当今占统治地位的网络组件OKHttp OkHttp 是一个相对成熟的解决方案,据说 Android4.4 的源码中可以看到 HttpURLConnection 已经替换成 OkHt…

luogu P1046 陶陶摘苹果

二次联通门 : luoguP1046 /*这个题好难.....由苹果树可知这应该是个树结构的题所以很自然的想到了用树链剖分来搞一下连边 最后查询以1为根节点的子树的权值和...从前闲的没事写着玩... */ #include <cstdio> #define Max 3300void read (int &now) {now 0;char wor…

毕业的这0111年

1.2004年&#xff0c;不知道大家对这个时间有没有感觉&#xff0c;那几年我正在读高中&#xff0c;韩寒的《三重门》席卷校园&#xff0c;同样还有郭敬明的《夏至未至》。那时候的我&#xff0c;还挣扎在温饱阶段&#xff0c;我每天吃饭的时候都想上食堂的三楼吃风味&#xff0…

Struts2_4_ActionMap与ValueStack详解_Struct2的EL及常用标签_防止表单数据重复提交

接着Struts2_3_day的讲 注:使用Struts2的< s:debug>< /s:debug>就可获取数据储存的分布图 StrutsPrepareAndExecuteFilter都会创建一个ActionContext和ValueStack对象, 所以Struts2的数据存储分为两类: ActionMap(contextMap)以及ValueStack; ActionMap中都是以m…

python快递代取系统_代取快递的变现方式,校园跑腿的经营范围有多大?

原标题&#xff1a;代取快递的变现方式&#xff0c;校园跑腿的经营范围有多大&#xff1f;进入大学&#xff0c;随着越来越多的学生加入到网购的行列。快递在学校也是堆积成山&#xff0c;高校校园快递市场也日渐红火。但往往带来的也有更多的麻烦&#xff0c;学生取快递时间变…

java 空指针异常之一。 新建的一个对象没有NEW 导致其SET属性时报错

代码&#xff1a; //会报错 Lendbook lbk;//不会报错 Lendbook lbknew Lendbook();//在这里报错lbk.setLenddate(new Date());lbk.setPersoncode(personcode);lbk.setPersonname(personname); 转载于:https://www.cnblogs.com/Ychao/p/6811648.html

我的互助小蜜圈

写在前面 从不久之前到现在&#xff0c;我的微信公众号从一个小小小阶段到了另一个小小阶段&#xff0c;非常感谢各位读者对我的信任和支持&#xff0c;当然我也是非常用心的维护这这群大佬&#xff0c;时刻想着怎样给各位大佬做好服务 &#xff0c;比如我正在溜娃&#xff0c…

设计模式_3_建造者模式

建造者模式(BuilderPattern) 内在的核心问题就是: 使用多个简单对象根据一种组合关系构造一个我们想要的复杂对象, 属于创建型模式 建造者模式的角色关系 建造者模式中总共有两种角色: 1.建造者: 负责建造每个基本组件 2.指挥者: 将建造者建造好的基本组件按照某种组合关系进…

比较两个表格的不同_两表数据的核对,WPS表格似乎更加方便容易

在EXCEL中的两个表格的数据对比&#xff0c;可能使用的方法会采用到查询语句&#xff0c;VBA之类的。显得在使用的过程显得有些复杂。在不经间发现WPS表格的功能处理此类的问题显得就比较的简单的多。查看并标识出分数相同的内容如下面的分数表&#xff0c;选择分数栏的范围&am…

6递归

1 /*2 递归函数:3 函数自己调用自己就叫递归函数4 递归可以实现循环5 递归是神,迭代是人(迭代循环)6 缺点:需要暂存大量的数据,递归次数太多会占用大量内存空间7 8 递归和迭代的区别9 迭代是循环结构 10 递归是选择结…

我的知识小密圈

写在前面从不久之前到现在&#xff0c;我的微信公众号从一个小小小阶段到了另一个小小阶段&#xff0c;非常感谢各位读者对我的信任和支持&#xff0c;当然我也是非常用心的维护这这群朋友&#xff0c;时刻想着怎样给大家做好服务 &#xff0c;比如我正在溜娃&#xff0c;隔断时…

设计模式_4_原型模式(对象的拷贝)

原形模式(PrototypePattern, 创建型模式,创建重复对象且保证性能, 对象的克隆) 通常使用原型模式创建一个原型接口, 用于获取创建对象的克隆, 对于浅拷贝与深拷贝不用纠结, 他们二者的区别就在于重写Clonable的clone方法 浅拷贝与深拷贝 浅拷贝: 直接调用Object的clone pub…

vk_down 每次下翻丙行 c++_笔记本接口不够用?不妨试试这款Type-C拓展坞,给你7个接口用...

随着笔记本电脑越来越轻薄化&#xff0c;已经很难再布局较多的数据接口了&#xff0c;但是在办公等环境下总是需要这些接口来满足需求。就拿小新个人来说&#xff0c;使用的是小米笔记本12.5寸款的&#xff0c;该款笔记本仅有三个接口&#xff0c;分别是全功能 USB-C 接口 x 1、…