设计模式——简单工厂模式
来源:互联网 发布:中国10月份经济数据 编辑:程序博客网 时间:2024/05/22 15:22
@Author:云都小生
设计模式简述
甄子丹与王宝强一起演的电影《一个人的武林》中,有这么一段话让我印象深刻——“先拳后腿次擒拿,兵器内外武合一”。由外到内修炼,内外结合方可小成。在软件开发领域,编程语言就相当于拳腿,各种开发工具就像是兵器,而这些东西都属于外功。那什么是内功呢?从数据结构到算法,从重构到设计模式等,这些都算是程序员的内功。拥有雄厚的内功,是所有武林人士的追求。
从今天开始今天,我也要来修修内功啦,赶紧上车吧~
几个问题引发的血案
在面向对象的程序设计中,平时我们在设计一个类的时候,经常会把大量的属性、方法封装在一起。但是在面向对象设计中有一个原则——单一职责原则,如果你把所有的功能都放在同一个类里面,那这个类就太“累”了,承当太多,这样一来代码的可维护性就会很低。
所以我们通常会把不同功能的,分成不同的类封装起来。在创建类的过程中,我们经常都会使用继承,来提高程序的可复用性,但是继承造成了高耦合,只要父类改了,子类就会跟着改。继承早就了高耦合。
在创建一个对象的时候,我们通常的方式都是用new的方式,除了效率不高外,还有另外一个问题。new XXX 如果我们定义的子类太多,在创建父类引用指向子类对象的时,经常会忘记子类的名字,得一个个去查,那岂不是很麻烦。
并且,如果一个类中没有对属性进行初始化,那我们就需要在对象创建的时候,给属性进行初始化,这样客户端的代码就会变得特别冗长。
综上问题,我们都可以用工厂模式来进行优化。工厂模式分为三类,分别是简单工厂模式、工厂方法模式、抽象工厂模式,对,难度一个比一个高。这一节我们来说一下简单工厂模式。
简单工厂模式
简单工厂模式有两个特点:
1. 将对象创建封装起来
2. 将具体化对象的代码放到子类中去
简单的说,用了简单工厂方法,我想创建一个对象,直接把信息传进去,对象就创建好了。具体的工作,都是由其他类(类创建者)去做,客户端不管。
先给一张图:
具体的做法是这样:
1. 将公共的属性和方法封装成一个抽象类或接口;
2. 通过继承(或实现),产生各个子类(或实现接口的类),需要考虑单一职责原则,不能设计一个包罗万象的类;
3. 创建一个工厂类,这个工厂类用于生产不同的对象,可以根据传入的不同参与,生产出相对应的对象;
我们来看一下代码,边看边分析。
代码分析
//抽象产品类,封装产品的共同属性和方法public abstract class Product { //抽象产品 public void publicMethod() { System.out.println("产品公共方法。"); } abstract void productTest();}//产品Onepublic class oneProduct extends Product { void productTest() { System.out.println("One product test:OK!"); }}//产品Twopublic class twoProduct extends Product { void productTest() { System.out.println("Two product test:OK!"); }}//工厂类public class Factory { public static Product getProduct(String arg) { Product product = null; if (arg.equalsIgnoreCase("One")) { product = new oneProduct(); //初始化设置One PSroduct } else if (arg.equalsIgnoreCase("Two")) { product = new twoProduct(); //初始化设置Two PSroduct } return product; } }//客户端类public class Test { public static void main(String[] args) { Product product; product = Factory.getProduct("one"); //通过工厂类创建产品对象 product.productTest(); } }
这样一来,我们就实现了客户端与对象对象创建的分离。有时候我们还可以将工厂与产品类合并,将对象创建的静态方法迁移到具体的产品类中。
适用范围与优缺点
简单工厂方法适用于:
1. 工厂类负责创建的对象比较少的时候;
2. 客户端只需要传入参数,并不关心对象的创建。
综上所述,我们引入一些简单工厂方法的优点:
1. 创建对象更加灵活了,实现了对象创建与客户端类的分离;
2. 在创建对象的过程中,我们只需要传入参数,不需要具体的去创建每一个对象。
缺点:
1. 难以扩展,一旦添加新的产品,就不得不修改工厂类,违背了“开闭原则;
2. 一旦工厂类不能工作,整个系统都将受到影响。
参考资料
史上最全设计模式导学目录
书籍:@K_Eckel《23种设计模式(C++)》
- 设计模式——简单工厂模式
- 设计模式——简单工厂模式
- 设计模式——简单工厂模式
- 设计模式——简单工厂模式
- 设计模式——简单工厂模式
- 【设计模式】——简单工厂模式
- 设计模式——简单工厂模式
- 设计模式——简单工厂模式
- 设计模式——简单工厂模式
- 设计模式——简单工厂模式
- 设计模式——简单工厂模式
- 设计模式——简单工厂模式
- 设计模式——简单工厂模式
- 设计模式——简单工厂模式
- 设计模式——简单工厂模式
- 设计模式——简单工厂模式
- 【设计模式】——简单工厂模式
- 设计模式——简单工厂模式
- cmd中的不是内部命令也不是可有运行的程序
- 利用QML画布实现一个泡泡对话 talk bubble
- mapper.xml 配置查出数据为空
- 算法题:尾部的零
- window程序基本结构
- 设计模式——简单工厂模式
- Lua学习笔记之面向对象
- OSI七层参考模型
- 如何评价AngularJS和BackboneJS
- 自己写的一个计算代码执行时间的函数
- su root 和su
- vs.net第一行的@ page命令行破折号提示警告信息没有为扩展名“.aspx”注册的生成提供程序
- 短实习---Java集合(基础知识)
- 2017 小米笔试题 编程题 求树的高度 Java代码实现