设计模式-简单工厂模式
简单工厂模式又称为静态工厂模式,它是根据传入的参数动态决定所要创建的对象,它是创建型模式家族中最简单的一种模式。
前面的话
前段时间刚参加一个高中老友的婚礼,中午在酒店举办了西式婚礼,随着婚礼的进行和主持人款款深情的叙说着他们的过往,现场的氛围深深触动了我,特别是看到红底白色衬衣结婚证上的照片出现在大屏幕上时,我忍不住哽咽了。这是多么甜蜜的一对啊,多年以后他们重新翻开结婚证看到这张照片时定会感恩光阴见证他们美好的从前。
好了,话不多说,借婚礼这一主题,今天我想谈谈简单工厂模式。现在比较流行的婚礼分为中式婚礼和西式婚礼,萝卜青菜各有所爱,我们可以选择中式婚礼或者西式婚礼。
首先我们抽象出婚礼抽象类
Wedding
两个具体婚礼类
ChineseWedding
和 WesternWedding
分别继承Wedding
婚礼工厂WeddingFactory
根据传入的参数负责创建具体的婚礼
先看类图,如下
UML类图
代码实现
抽象婚礼类, Wedding
package com.lms.SimpleFactory;
/**
* <p>文件描述: 抽象婚礼类</p>
*
* @Author luanmousheng
* @Date 17/6/17 上午12:01
*/
public abstract class Wedding {
/**
* 新郎
*/
private String bridegroom;
/**
* 新娘
*/
private String bride;
public String getBridegroom() {
return bridegroom;
}
public void setBridegroom(String bridegroom) {
this.bridegroom = bridegroom;
}
public String getBride() {
return bride;
}
public void setBride(String bride) {
this.bride = bride;
}
public void kiss() {
System.out.println(bridegroom + " kiss " + bride);
}
/**
* 举行婚礼仪式
*/
protected abstract void wed();
}
中式婚礼类, ChineseWedding
package com.lms.SimpleFactory;
/**
* <p>文件描述: 中式婚礼</p>
*
* @Author luanmousheng
* @Date 17/6/17 上午12:06
*/
public class ChineseWedding extends Wedding {
@Override
public void wed() {
System.out.println("一拜天地");
System.out.println("二拜高堂");
System.out.println("夫妻对拜");
System.out.println("送入洞房");
}
}
西式婚礼类, WesternWedding
package com.lms.SimpleFactory;
/**
* <p>文件描述: 西式婚礼</p>
*
* @Author luanmousheng
* @Date 17/6/17 上午12:10
*/
public class WesternWedding extends Wedding {
@Override
public void wed() {
System.out.println("新娘走过婚礼通道");
System.out.println("证婚人致词");
System.out.println("父母致词");
System.out.println("新人婚礼誓言");
System.out.println("交换戒指");
System.out.println("喝交杯酒");
}
}
婚礼工厂类, WeddingFactory
package com.lms.SimpleFactory;
/**
* <p>文件描述: 婚礼工厂</p>
*
* @Author luanmousheng
* @Date 17/6/17 上午12:17
*/
public class WeddingFactory {
public static Wedding selectWedingStyle(String style) {
switch (style) {
case "chinese":
return new ChineseWedding();
case "western":
return new WesternWedding();
default :
return null;
}
}
}
Demo类, SimpleFactoryDemo
package com.lms.SimpleFactory;
public class SimpleFactoryDemo {
public static void main(String[] args) {
Wedding wedding = WeddingFactory.selectWedingStyle("chinese");
wedding.setBridegroom("李文");
wedding.setBride("叶子");
wedding.kiss();
wedding.wed();
}
}
运行SimpleFactoryDemo
后输出如下结果:
李文 kiss 叶子
一拜天地
二拜高堂
夫妻对拜
送入洞房
优缺点
优点:简单工厂模式创建对象时很简单。工厂类负责创建对象,需要该对象的业务方不需要知道该对象的具体创建过程,完全委托给工厂来创建,将业务方从创建对象的繁琐中解脱出来。
缺点:缺点很明显,
- 当有新具体类型对象需要创建时,需要修改工厂类,这违反了软件工程的开闭原则。也就是说简单工厂模式适合对象类型比较明确,不再变化的情景。案例中介绍的婚礼就比较适合用简单工厂模式,因为婚礼类型基本上也就是中式婚礼和西式婚礼了,日常生活中还真没有见过其他的婚礼(除非少数民族的婚礼,那说起来可能就多了~)。
- 另外,如果对象类型比较多,该工厂负责的对象创建逻辑太多,责任过于沉重。