写在前面
说起来惭愧,设计模式系列本来早就想写了,也参考了很多书籍和博客,但是始终没有下手,冷风中瑟瑟发抖,看前面就知道,转载了俩篇,想糊弄一下,嘻嘻,但是这俩天突然受到了刺激(当然是跟超级大佬在一起讨论被叼了)所以从这章节起,我要开始认真了(划水),也希望各位看官们多提点意见,多多支持(超级大佬轻拍,略略略)。
快乐的我又回来了,拖了几天时间,主要是最近太忙了(呜呜。。。),废话不多说,首先来看一下百度百科对简单工厂模式的解释:
简单工厂模式是属于创建型模式,又叫做静态工厂方法(Static Factory Method)模式,但不属于23种GOF设计模式之一。简单工厂模式是由一个工厂对象决定创建出哪一种产品类的实例。简单工厂模式是工厂模式家族中最简单实用的模式,可以理解为是不同工厂模式的一个特殊实现。
(1)UML图:
工厂类:简单工厂模式的核心,负责生产具体的产品,实现具体的内部逻辑。
具体产品类:具体的产品,由工厂类生产出来。
抽象产品类:所有具体产品的父类。负责描述所有产品的公共接口
(2)简单例子:
我们就以一个生产玩具的工厂来作为列子吧!
玩具分为俩种玩具:电动玩具和非电动玩具,那么首先我们就要有个父类来描述玩具这个抽象的事物:
public abstract class WanJu{
/**
*抽象的产品类,负责描述抽象的产品,是具体产品类的父类
**/
public abstract void toys();
}
然后是具体的产品类:电动产品和非电动产品去继承抽象产品这个父类
public class DianDong extend WanJu{
@Overried
public void toys(){
System.out.println("我是电动玩具!")
}
}
public class FeiDianDong extend WanJu{
@Overried
public void toys(){
System.out.println("我是非电动玩具!")
}
}
好了,我们定义好了具体的产品和他们的抽象父类了,该到核心类了——那么,这些玩具要由工厂去生产吧,那么,我们定义一个工厂类去生产这些具体的玩具!
public class ToysFactory {
public static Toys createToys (String type){
Toys toys =null;
switch (type) {
case "dianDong":
toys =new DianDOng();
break;
case "feiDianDong":
toys =new FeiDianDong();
break;
}
return toys ;
}
}
工厂类是负责生产具体的产品,你只要输入你想生产的具体产品的类型就可以了。
测试:
public class CreatToys {
public static void main(String[]args){
ToysFactory.createToys("dianDong").toys;
}
}
如果我们还要想增加其他的具体玩具,就去实现抽象玩具类,然后自己完成自己的部分就行了,工厂类再添加一条生产其他玩具的判断就ok了!
使用场景:
-
工厂类创建的对象比较少;
-
消费者只需要传进工厂类的参数,对于如何创建对象不关心;
简单工厂模式的优点:
-
首先程序实现了解耦和,大大降低的程序之间的耦合
-
提高了程序的扩展性
简单工厂模式的缺点:
可实例化的类型在编译期间已经被确定,如果增加新类型,则需要修改工厂,违背了开放封闭原则(ASD) 。 简单工厂需要知道所有要生成的类型,当子类过多或者子类层次过多时不适合使用。