简单工厂、工厂模式初学习
借鉴 :《大话数据结构》 http://www.cnblogs.com/cj723/
活字印刷--面向对象
活字印刷,即当需要改变部分字的时候,不需要整个刻板全部重新刻,解耦。
- 可维护
- 要改,只需更改要改之字
- 可复用
- 这些字并非这次用完就无用,完全可以后来的印刷中重复使用
- 可扩展
- 若需要在已有内容里加字,只需要另刻字加入即可
- 灵活性好
- 子的排版可能是竖排也可能是横排,需求改变时只需要将活字移动就克做到满足排列需求
所以需要通过 封装、继承、多态把程序的耦合度降到最低
- 业务的封装
- 将业务逻辑与界面逻辑分开,让他们之间的耦合度下降
- 比如一个Windows计算器,将计算和显示分开
- Operation运算类
- 加减乘除功能具体实现
- 客户端类
- 输入界面的UI
- Operation运算类
- 只增加一个功能,不影响计算器原有的功能代码发生改变--将加减乘除等运算分离,修改其中一个不影响另外的几个
- Operation类
- set 与 get 方法
- 虚方法:GetResult()用于得到结果
- 加减乘除类 继承 Operation类
- 加减乘除功能具体实现
- 对于每一个功能重写GetResult()方法
- 加减乘除功能具体实现
- 客户端类
- Operation类
现在的问题是:如何去实例话一个对象
1.简单工厂模式--"switch-case"--类创建型模式
专门定义一个类用来负责创建其他类的实例,被创建的实例通常都具有共同的父类
public class OperationFactory {public static BaseOperation createOperation(String operate) {int sum = 0;switch (operate) {case "+":sum=new OperationAdd();break;case "-":sum=new OperationSub();break;case "*":sum=new OperationMul();break;case "/":sum=new OperationDiv();break; }return sum ;}
}
复制代码
- 优点
- 工厂类是整个模式的关键,包含了必要的逻辑判断,根据外界给定的信息,决定究竟应该创建哪个具体类的对象
- 缺点
- 由于工厂类集中了所有实例的创建逻辑,违反了高内聚责任分配原则,将全部创建逻辑集中到了一个工厂类中;它所能创建的类只能是事先考虑到的,如果需要添加新的类,则就需要改变工厂类了。
- 意义
- 通过使用工厂类,外界可以从直接创建具体产品对象转换为直接使用对象就可以了,而不必管这些对象是如何创建及如何组织的,明确了各自的职责和权利,有利于整个软件体系结构的优化
相关借鉴: https://www.jianshu.com/p/3f824a91d73b https://juejin.im/post/59cd07eb6fb9a00a3c4b40ba
继续阅读的知识点补充与温故:
1.抽象--abstract
Animal类根本就不可能实例化,一只猫长什么样子可以想象,但是实例化一个动物,那么动物长什么样?所以动物是一个抽象的名词,没有具体对象与之对应
【抽象类的注意事项】
- 抽象类不能实例化
- Animal实例化没有意义
- 抽象方法是 必须 被子类重写 的方法
- 如果类中包含抽象方法,那么累就必须定义为抽象类,不论是否还包含其他一般的方法
抽象类应该拥有尽可能多的共同代码,拥有尽可能少的数据
设计一个抽象类时,一定是用来继承的
如果牛、羊、狗、猫、猴是最后一级,那么他们就是具体类,
但如果还有更下面一级的金丝猴继承于猴,哈巴狗继承于狗,
那就需要考虑把猫和狗改为抽象类的了
复制代码
2.开放-封闭原则--多扩展,少修改--面对对象设计的核心所在
精髓:面对需求,对程序的改动是通过增加新代码进行的,而不是更改现有的代码
- 对于拓展是开放的
- 对于更改是封闭的
2.工厂模式
定义一个用于创建对象的接口,让子类决定实例化哪一个类
工厂模式使一个类的实例化延迟到其子类
简单工厂模式 和 工厂模式 的 对比例子--雷锋工厂
//定义一个雷锋类
public class LeiFeng {public void sweep(){System.out.println("扫地");}public void wash(){System.out.println("洗衣");}public void cook(){System.out.println("做饭");}
}
复制代码
//学雷锋的大学生类,继承雷锋
public class Undergraduate extends LeiFeng
{ }
复制代码
//客户端代码
public class Main
{ public static void main(String[] args) { LeiFeng xueleifeng = new Undergraduate(); xueleifeng.buyRice(); xueleifeng.sweep(); xueleifeng.wash(); }
}
复制代码
- 现在假设有三个人要去代替他做这些事,那就应该实例化三个学雷锋的大学生对象了
LeiFeng student1 = new Undergraduate();
student1.buyRice(); LeiFeng student2 = new Undergraduate();
student2.sweep(); LeiFeng student3 = new Undergraduate();
student3.wash();
复制代码
- 然而不仅仅有大学生去帮助老人,还有“社区志愿者”也会参与其中,那么这样的写法就非常不合适了,因为我们需要更改多个实例化的地方,所以还需要增加一个继承“雷锋”的类 --“社区志愿者”类
1.简单工厂模式
//社区志愿者
public class Volunteer extends LeiFeng
{ }
//简单工厂类
public class SimpleFactory
{ public static LeiFeng createLeiFeng(String type) { LeiFeng result = null; if ("学雷锋的大学生".equals(type)) { result = new Undergraduate(); } else if ("社区志愿者".equals(type)) { result = new Volunteer(); } return result; }
} //客户端代码,如果要换,就只需要换“学雷锋的大学生”为“社区志愿者” LeiFeng studentA = SimpleFactory.createLeiFeng("学雷锋的大学生");
studentA.buyRice(); LeiFeng studentB = SimpleFactory.createLeiFeng("学雷锋的大学生");
studentB.sweep(); LeiFeng studentC = SimpleFactory.createLeiFeng("学雷锋的大学生");
studentC.wash();
复制代码
2.工厂模式
//雷锋工厂
public interface IFactory
{ LeiFeng createLeiFeng();
}
//学雷锋的大学生工厂
public class UndergraduateFactory implements IFactory
{ public LeiFeng createLeiFeng() { return new Undergraduate(); }
}
//社区志愿者工厂
public class VolunteerFactory implements IFactory
{ public LeiFeng createLeiFeng() { return new Volunteer(); }
}
//客户端代码
public class Main
{ public static void main(String[] args) { //要换成“社区志愿者”修改这里就可以了//只需要修改一处就可以了,这是最佳的做法IFactory factory = new UndergraduateFactory(); LeiFeng student = factory.createLeiFeng(); student.buyRice(); student.sweep(); student.wash(); }
}
复制代码
- 总结:
- 他们都是集中封装了对象的创建,使得要更换对象时候,不需要做大的改动就能实现,降低了客户端与产品对象的耦合
- 工厂模式使简单工厂模式的进一步抽象和推广
3.策略模式--算法独立于使用它的客户而变化
- Context: 环境类
- Strategy: 抽象策略类
- Strategy: 抽象策略类
它定义了算法家族,分别封装起来,让他们之间可以相互替换,此模式让算法的变化,不会影响使用算法的客户。
参考:http://hjxandhmr.github.io/2016/06/10/DesignPattern-Strategy/
简单工厂、工厂模式初学习相关推荐
- 【设计模式学习】工厂方法模式
cpp学习设计模式:工厂方法模式 在学习工厂方法模式之前,先回忆前面学的简单工厂模式: 简单工厂模式就是将对象的创建和逻辑的判断都交给了一个工厂类去做,这样做的优点是客户端不需要知道具体产品类的类名和 ...
- java简单工厂模式实例造车,JAVA设计模式学习5——工厂方法模式
工厂方法模式(Factory Method)又称虚拟构造子模式,可以说是简单工厂的抽象,也可以理解为简单工厂是退化了的工厂方法模式,其表现在简单工厂丧失了工厂方法的多态性.我们前一节中提到当产品结构变 ...
- 工厂方法模式--结合具体例子学习工厂方法模式
在学习工厂方法模式之前,可以先学习一下简单工厂模式,网址是http://blog.csdn.net/u012116457/article/details/21650421,这里仍以水果的实例讲解. 先 ...
- 详解设计模式之工厂模式(简单工厂+工厂方法+抽象工厂)
园子里关于23种设计模式的博文已经可以说是成千上万.车载斗量.屯街塞巷.不计其数.数不胜数.摩肩接踵.汗牛充栋.车水马龙.门庭若市.琳琅满目直至让人眼花缭乱了.在这样的大环境下之所以来写设计模式类的博 ...
- 详解设计模式之工厂模式(简单工厂+工厂方法+抽象工厂) v阅读目录
1楼留头头大神:http://www.cnblogs.com/toutou/p/4899388.html v阅读目录 v写在前面 v简单工厂模式 v工厂方法模式 v抽象工厂模式 v博客总结 v博客前言 ...
- 设计模式学习-工厂方法模式
在上文(设计模式学习-简单工厂模式)的模拟场景中,我们用简单工厂模式实现了VISA和MASTERARD卡的刷卡处理,系统成功上线并运行良好,突然有一天老大跑来说,我们的系统需要升级,提供对一般银联卡的 ...
- 简单工厂模式,工厂方法模式,抽象工厂模式,spring的狂想
菜鸟D在项目中遇见一个比较纠结的高耦合,所以就想办法来解耦.情况是这样的:系统通过用户选择treeview控件的节点判断调用不同的处理,这些处理中某些东西又是类似的.同事的建议是采用简单工厂,耦合就耦 ...
- java工厂模式的学习
package demo2; /** * * @author saiweisiaa *简单工厂模式的学习 */ class productA implements product{ public v ...
- 【设计模式】简单工厂模式+工厂方法模式+抽象工厂模式
前提导论 故事 不采用工厂模式 简单工厂模式 工厂方法模式 故事 抽象工厂模式 故事结局 前提导论 为了学习设计模式时便于理解,我将用基于农夫和他的村子与森林为背景环境,讲一个故事时,阐述一个设计模式 ...
最新文章
- css position的父级,css position absolute 相对于父元素的设置方式
- AQS.accquire
- Factors of Factorial(AtCoder-2286)
- org.apache.subversion.javahl.ClientException: Working copy is not up-to-date
- 2018-2019-1 20165208 《信息安全系统设计基础》第5周学习总结
- [C++11] 右值引用和移动语义
- Python学习笔记(四)—生成随机数
- window环境下杀死tomcat
- UE4 植被工具的使用
- 极限学习机原理(含公式推导透彻)
- 使用win7超级终端连接华为交换机并配置端口镜像
- Windows用户账户控制详解
- CINTA作业六:拉格朗日定理
- Canvas 和 SVG 的区别是什么?
- 【Python3笔记】五、Python 字符串
- uninstall和install
- 计算机网络是啥意思啊,kk是什么意思?
- C++11标准模板(STL)- 算法(std::nth_element)
- h3cr4900g3安装系统_H3C服务器安装Windows操作系统
- 计算机图形学三维建模及灯光作业(派大星)
热门文章
- Drawable Resource 之旅(一):BitmapDrawable 详解
- Python模块包中__init__.py文件的作用
- select标签的使用
- jQuery 中 attr() 和 prop() 方法的区别
- SGU 111 Very simple problem
- get_headers()请求https报错解决思路
- Leetcode 350 两个数的交集2
- 使用Helm 在容器服务k8s集群一键部署wordpress
- 看菲菲详解如何快速获取linux命令帮助
- java编写socket使用bufferedReader.readLine()问题研究