简单工厂模式
Static Factory Method:属于创建型模式的一种,又可以被称为静态工厂方法模式,但是不属于GoF23种设计模式之一。
结构
对于简单工厂模式的结构,给出一个简易的UML类图:
从图片中,可以知道简单工厂模式的组成分为三个部分:
- 第一个也就是工厂啦,简单工厂模式说到底也是一个工厂模式嘛,工厂自然是必不可少的。
- 第二个则是一个抽象类(当然,也可以设计成一个接口),这是一个对于所有工厂可以生产的东西的一个抽象。
- 第三个则是具体的实现类了,也是上图中的产品1,产品2,产品…代表的也是实实在在的需要被工厂所生成的事物对象。
举例说明
-
第一个例子用比较贴近图像上所绘制的表达效果:比如有一家电脑制造商,这一家电脑制造商呢原先只制作一种牌子A牌的电脑,后来发现B牌比较火,然后急忙制作B牌的电脑,后来陆陆续续加上了C牌的,D牌的,等等。
这里的电脑制造商——工厂类,而电脑——抽象产品类,各种品牌的电脑——各种产品类啦,
-
第二个例子再进一步提升一下:比如计算器,计算器是用于计算的,计算可以分为加减乘除,平方,开根号啊登等。
这里的计算器——工厂类,而计算方式——抽象产品类,加减乘除什么的——各种实际的产品类啦。
注意
- 虽然使用到简单工厂模式的位置比较多,简单工厂模式也正是突出了简单二字,小小的一个模式就体现处了面向对象的的三大特性——封装,继承,多态。但是简单工厂模式的主要核心就在工厂类里面,而且在定义好了之后,如果需要新增工厂中的产品那么是需要进行源代码的修改的,这违背了开闭原则同时使得代码具有高内聚的特性。
- 所以使用简单工厂模式的场景,首先一点就和它自己的名字相当,要求是一个比较简单的场景,其次,不关注具体的实现细节,用户所需要的就是传入内定好的各种标志或者其他什么规范数据,给到用户自身想要的产品即可。
一个小DEMO
-
场景
不涉及太复杂的场景,直接通过上面的类图来定义,主要有一个工厂可以生成几种不同的产品。
-
紧接着定义抽象类
package com.factory.simple; /** * 简单工厂模式——抽象类 * @author WQ */ public abstract class ProductAbstract { /** * 简单的定义一个方法,用于后面测试多态性 */ public abstract void show(); }
-
定义具体的产品类
package com.factory.simple; /** * 简单工厂模式——实际产品类A * @author WQ */ public class ProductA extends ProductAbstract{ @Override public void show() { System.out.println("Created a product called ProductA!"); } } //-------------------------------------------------------------------- package com.factory.simple; /** * 简单工厂模式——实际产品类B * @author WQ */ public class ProductB extends ProductAbstract{ @Override public void show() { System.out.println("Created a product called ProductB!"); } }
-
最后定义好工厂类(用if-else分支还是switch都是可以的)
package com.factory.simple; /** * 简单工厂模式——工厂类 * @author WQ */ public class Factory { /** * 创建具体产品的方法,用户只需要调用这个方法就可以了 * @param productName * @return */ public ProductAbstract getProduct(String productType) { if (productType.equalsIgnoreCase("A")) { return new ProductA(); }else if (productType.equalsIgnoreCase("B")) { return new ProductB(); }else { return null; } } }
-
紧接着来一波测试
package com.factory.simple; /** * 简单工厂模式——测试类 * @author WQ */ public class Main { public static void main(String[] args) { // 创建工厂类 Factory factory = new Factory(); // 通过工厂创建具体的产品 ProductAbstract productA = factory.getProduct("A"); productA.show(); ProductAbstract productB = factory.getProduct("B"); productB.show(); } }
-
测试结果输出
Created a product called ProductA! Created a product called ProductB!
完成!!!