设计模式(1): 简单工厂模式 SimpleFactory

简单工厂太简单了,其它并不是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。代码直观让人一看就明白。

    弊:首先是违反那个原则,如果经常要扩展一般不会使用。另外新手很喜欢写这种代码,让你的项目半残。

  • 小记:

    本人还是挺喜欢这个模式的,虽然说违反了什么原则,但个人认为原则什么的,或是设计模式什么的都是纸上的东西,如果你要做的项目只有两个万年不变的对象,还要你去写个工厂方法去生产,就感觉性价比低了些。