美文网首页Java设计模式JAVA设计模式
设计模式-工厂模式一(简单工厂模式)

设计模式-工厂模式一(简单工厂模式)

作者: YannisChen_2017 | 来源:发表于2018-08-25 22:32 被阅读24次

关于设计模式相关的讲解应该有很多。在这里只是简单写一下自己的理解。做个记忆加深,若有可能再跟上一点交流。

其实在工厂模式之前,应该先大概理解什么是工厂模式,为什么一个工厂模式还分为简单工厂模式、工厂方法模式与抽象工厂模式。

工厂模式顾名思义就是类似于现实社会的工厂一样的模式(其实设计模式很多都是来源于生活,做了抽象。之后又去指导生活)。

在封建社会里,大家都是自给自足。什么东西都是自己来创建(new)。造成了资源的浪费,社会也进步有限。最主要的是,慢慢的大家发现,自己做的没有别人家的好。我仅需要原来耗费材料的部分就可以去交换其他人创建的更好的物品。这就是刚开始的简单工厂模式的雏形。

举个栗子:

/**

* 简单的牛奶接口,后续的其他实现都会有牛奶的基本属性(白白的,液体)

*/

public interface IMilk {
  public String createMilk();
}

因为我们可能会需要不同的牛奶,所以会有不同的牛奶实现

public class MengniuMilkimplements IMilk {

    @Override
    public StringcreateMilk() {
        return "蒙牛 天生要强!";
    }
}

public class SanYuanMilkimplements IMilk {
    @Override
    public StringcreateMilk() {
       return "好牛奶,三元造!";
    }
}

再来罐伊利

public class YiLiMilkimplements IMilk {
    @Override
    public StringcreateMilk() {
      return "好牛,好奶!好伊利!";
    }
}

至此我们已经创建了三种牛奶的实现,在简单工厂模式下会如何处理呢?

public class SimpleFactory {

    //注意:若不使用 final关键字  会报constant expression required的编译期错误
    //case语句后面必须是常量,使用final修饰
    public static final int MENGNIU_TYPE =1;
    public static final int YILI_TYPE =2;
    public static final int SANYUAN_TYPE =3;

    public static IMilkcreateDiffMilk(Integer milkType){

        switch (milkType){
                case MENGNIU_TYPE:
                    return new MengniuMilk();
                case YILI_TYPE:
                    return new YiLiMilk();
                case SANYUAN_TYPE:
                    return new SanYuanMilk();
                default:
                    return null;
        }
  }
}

那么我们该如何喝到想喝的牛奶呢?

public class SimpleTest {

  public static void main(String[] args) {
        //比如我们要喝蒙牛的牛奶,仅需要
        IMilk mengniu = SimpleFactory.createDiffMilk(SimpleFactory.MENGNIU_TYPE);
        IMilk yili = SimpleFactory.createDiffMilk(SimpleFactory.YILI_TYPE);
        IMilk sanyuan = SimpleFactory.createDiffMilk(SimpleFactory.SANYUAN_TYPE);
        System.out.println(mengniu.createMilk());
        System.out.println(yili.createMilk());
        System.out.println(sanyuan.createMilk());
    }
  }
}

类图如下

image

特点

1 它是一个具体的类,非接口 抽象类。有一个重要的createDiffMilk()方法,利用if或者 switch创建产品并返回。

2 createDiffMilk()方法通常是静态的,所以也称之为静态工厂。

缺点

1 扩展性差(我想增加一种牛奶,除了新增一个牛奶产品类,还需要修改工厂类方法)

2 不同的产品需要不同额外参数的时候 不支持。

针对这种拓展不是太方便的情况?我该如何处理呢?是否有其他方式可以很好的解决这一问题呢?

参见下章

相关文章

  • 设计模式-工厂模式

    设计模式1 设计模式2 工厂模式 工厂模式可简单的分为三类:简单工厂,工厂方法,抽象工厂 简单工厂模式 定义 简单...

  • 设计模式四、抽象工厂模式

    系列传送门设计模式一、单例模式设计模式二、简单工厂模式设计模式三、工厂模式设计模式四、抽象工厂模式 抽象工厂模式 ...

  • 设计模式三、工厂模式

    系列传送门设计模式一、单例模式设计模式二、简单工厂模式设计模式三、工厂模式设计模式四、抽象工厂模式 工厂模式 在一...

  • iOS设计模式-工厂模式

    工厂模式分为简单工厂模式,工厂模式、抽象工厂模式三类。 简单工厂模式 1. 定义 简单工厂模式并不是常用的设计模式...

  • 常用设计模式

    设计模式 工厂模式 工厂模式思路上分:简单工厂模式,工厂模式, 抽象工厂模式// 抽象工厂模式可以代替工厂模式,做...

  • Android设计模式:工厂设计模式

    目录 简单工厂模式工厂方法模式抽象工厂模式 简单工厂模式 简单工厂模式是所有工厂模式的基础,不属于23种设计模式范...

  • 设计模式

    设计模式(视频总结) [TOC] 一、简单工厂模式(Simple Factory) 简单工厂模式: 简单工厂模式属...

  • 设计模式-创建型模式-工厂模式(工厂三兄弟)

    设计模式-创建型模式-工厂模式(工厂三兄弟)工厂模式分为简单工厂,工厂方法,抽象工厂。 简单工厂模式 一个接口,三...

  • 相近设计模式比较

    设计模式干货: 简单工厂模式 vs. 工厂模式 vs. 抽象工厂模式简单工厂和工厂模式区别? 简单工厂没有多个子类...

  • 设计模式一、单例模式

    系列传送门设计模式一、单例模式设计模式二、简单工厂模式设计模式三、工厂模式设计模式四、抽象工厂模式 简单单例(推荐...

网友评论

    本文标题:设计模式-工厂模式一(简单工厂模式)

    本文链接:https://www.haomeiwen.com/subject/cfkniftx.html