简单工厂太简单了,其它并不是GOF提到的23种模式里面的。只是都喜欢这么叫,哈哈。
前言
之前看到GOF的《设计模式 可复用面向对象软件的基础》 ,看的时候觉得思想不错,但一直没有手支练下,今天回想起来,好像写的很多东西都可以在里面找到其思想。所以就重温下,顺便记下笔记。书上的例子都是c写的,由于现在工作中主要写Java代码较多,就用Java记录下。
简单工厂模式 Simple Factory
我先申明一下:
每种设计模式都有它的使用场景,我不会在这里去解释,只把原文贴出来,一是本人语言水平差,那些定理类的话很难通俗说出来,二是建议不要被这种定理蒙蔽思想,你去学习设计模式是写代码实战的,不是去考证书的。这种程度的代码,自己敲一次去运行分析一下,就什么都懂了。
另外,做完了之后记得去看下UML类图,网上一大把,我这里也不重画了,当然你自己做的时候就可以在纸上画。
问题:
If an application is to be portable, it needs to encapsulate platform dependencies. These “platforms” might include: windowing system, operating system, database, etc. Too often, this encapsulatation is not engineered in advance, and lots of #ifdef case statements with options for all currently supported platforms begin to procreate like rabbits throughout the code.
意图:
- Provide an interface for creating families of related or dependent objects without specifying their concrete classes.
- A hierarchy that encapsulates: many possible “platforms”, and the construction of a suite of “products”.
- The new operator considered harmful.
代码:
例:话说老板有一个工厂,有两台机器,可以生产包子和馒头,老板想吃包子了,只要对工厂说声我要吃包子,工厂就负责把包子带给老板,而老板不需要自己去找到生产包子的那台机器。
代码1:工厂类simplefactory
package com.xdnote.DesignPattern.simplefactory;
/**
* 简单工厂模式
* 工厂类 ,生产包子和馒头
* @author xdnote
* @see xdnote.com
* **/
public class SimpleFactory {
/**
* 核心方法,根据想要的东西,发出指令,在工厂里面取出相应的对象
* @param order
* @return Food
* */
public static Food creatFood(String order){
Food food=null;
if(order.equals("包子")){
food=new Baozi();
}else if(order.equals("馒头")){
food=new Mantou();
}else{
food=new Food();
}
return food;
}
}
代码2,3,4:吃的Food,包子Baozi,馒头Mantou
package com.xdnote.DesignPattern.simplefactory;
/**
* 简单工厂模式
* 具有特性的产品类,可以在这个类里面定义一些共性的方法,再去创建不同的子类去分别实现这些方法
* @author xdnote
* @see xdnote.com
* **/
public class Food {
/**
* 定义特性方法,食物都是可以吃的,定义一个方法 eat
* @return String
* */
public String eat(){
return "给你吃的";
}
}
public class Baozi extends Food{
@Override
public String eat() {
return "送你吃包子";
}
}
public class Mantou extends Food{
@Override
public String eat() {
return "请你吃馒头";
}
}```
代码5:老板类Client
```java
package com.xdnote.DesignPattern.simplefactory;
/**
* 简单工厂模式
* 最终客户
* @author xdnote
* @see xdnote.com
* **/
public class Client {
public static void main(String[] args){
Food food=SimpleFactory.creatFood("包子"); //吃包子就拿饺子来
System.out.println(food.eat());
food=SimpleFactory.creatFood("馒头"); //吃馒头就拿馒头来
System.out.println(food.eat());
food=SimpleFactory.creatFood("管它什么都吃");
System.out.println(food.eat());
}
}
好了,这样一个简单的工厂模式就这样了,工厂模式算是最基本的模式了,估计大家也用的不少了。
好处是如果包子出现了问题只需要去包子里检查问题,馒头出了问题只需要去馒头里面检查问题。
小结
看到网上很多人搜什么设计模式排行什么之类的,难易度之类的,其实我觉得都是没有理解设计模式思想,还停留在硬套。
拿武侠来比喻下,设计模式并不是剑招,而是剑道,并不能直接提高你的剑法,但你要是领悟了剑道,即使你只会基本的几招,你都可以见招拆招,剑法也自然提升了。
这里只记录下本人的开发感受。由于项目,语言的不同,每个人的感受都可能不一样!.
简单工厂模式 Simple Factory
- 使用频率:
极高
这个模式已经是第生产对像时所有到的默认的模式了,写很多代码时,先写一个这样的模式出来,再慢慢改造。(实际上我们一般都会改良,这个模式违反了什么开放封闭原则,所以不容它长期停留,如果复杂的话,一般会改进成为工厂方法~)
当然,这种模式有也经常不会改进,存在JavaScript尤其多,一般出现新对象都会使用编写时发现并适配。
- 利弊影响:
中
利:非常简单,简单的判断很难出现流程上的BUG。代码直观让人一看就明白。
弊:首先是违反那个原则,如果经常要扩展一般不会使用。另外新手很喜欢写这种代码,让你的项目半残。
- 小记:
本人还是挺喜欢这个模式的,虽然说违反了什么原则,但个人认为原则什么的,或是设计模式什么的都是纸上的东西,如果你要做的项目只有两个万年不变的对象,还要你去写个工厂方法去生产,就感觉性价比低了些。