java设计模式之简单工厂模式
简单工厂模式的定义:
简单工厂模式又叫静态工厂方法模式,简单来说,简单工厂模式有一个具体的工厂类,可以生产出不同的产品,属于创建型设计模式。
简单工厂模式不在GoF23三种设计模式之列。
简单工厂模式的应用场景:
简单工厂模式适合产品种类较少,也就是需要创建的对象较少的情况下运用。使用简单工厂模式创建可以让调用者不必关系对象的创建细节。
简单工厂模式案例:
比如某电子书商城,读者买了两本书,一本是java相关的,一本是c相关的。我们现在以读者阅读电子书为例,来看看简单工厂模式具体
实现以及用了它有什么好处。以下是代码实现:
电子书接口:
package com.liuyi.designmode.creational.simplefactory; /** * 电子书接口 */ public interface EBook { /** * 阅读方法 */ public void read(); }
c语言书籍实现:
package com.liuyi.designmode.creational.simplefactory; /** * C语言书籍 */ public class CBook implements EBook{ @Override public void read() { System.out.println("阅读c语言书籍"); } }
java书籍实现:
package com.liuyi.designmode.creational.simplefactory; /** * java语言书籍 */ public class JavaBook implements EBook { @Override public void read() { System.out.println("阅读java语言书籍"); } }
创建书籍对象的工厂:
package com.liuyi.designmode.creational.simplefactory; /** * 创建不同种类的电子书的简单工厂类 */ public class EBookFactory { public static EBook createEBook(String type){ EBook eBook; switch (type){ case "java": eBook = new JavaBook(); break; case "c": eBook = new CBook(); break; default: throw new RuntimeException("当前电子书不存在"); } return eBook; } }
测试类:
package com.liuyi.designmode.creational.simplefactory; /** * 简单工厂模式测试类 */ public class SimpleFactoryTest { public static void main(String[] args) { //比如我想读java的书籍 EBook java = EBookFactory.createEBook("java"); java.read(); } }
可以看到,调用者不需要知道对象具体是如何创建的就能实现对象的创建,这样做降低了创建对象与程序的耦合性。举个例子,比如我们查看
书的价格的、查看书的总字数,查看书的总页数等等操作的时候,前提条件都需要创建一个对象,这样我们在程序种就会出现很多地方new一个
对象的代码,一旦我们new 对象的代码根据业务的改变发生变化的时候,我们就需要去每个地方都改一遍,这样就和程序的耦合性太高了,不利于
程序的扩展和维护。但是我们用简单工厂模式就不一样了,我们只需要修改工厂类的代码即可完成代码的扩展。
代码优化:
此时调用者创建对象是很简单了,但是如果商城又上架一本c++类型的书籍,此时就需要修改工厂类的代码了,这显然不符合开闭原则。
因此我们可以用反射的技术继续对简单工厂类进行优化,代码如下:
工厂类修改如下:
package com.liuyi.designmode.creational.simplefactory; /** * 创建不同种类的电子书的简单工厂类 */ public class EBookFactory { public static EBook createEBook(Class<? extends EBook> clazz){ EBook eBook = null; try { if(clazz!=null){ eBook = clazz.newInstance(); } } catch (Exception e) { e.printStackTrace(); } return eBook; } }
测试类修改如下:
package com.liuyi.designmode.creational.simplefactory; /** * 简单工厂模式测试类 */ public class SimpleFactoryTest { public static void main(String[] args) { //比如我想读java的书籍 EBook java = EBookFactory.createEBook(JavaBook.class); java.read(); } }
总结:
简单工厂模式的优点:
简单工厂模式的结构简单,调用方便。对于外界给定的信息,可以很方便的创建出相应的产品。工厂和产品的职责区分明确。
简单工厂模式的缺点:
简单工厂模式的工厂类单一,负责所有产品的创建,但当产品基数增多时,工厂类的代码会非常臃肿,违背高聚合原则。