设计模式-工厂模式
工厂模式,定义一个用于创建对象的接口,让子类决定具体实例化哪个类。工厂模式适用于只有一种抽象产品的情景,具体产品可以有多个(如果存在多个抽象产品的情景,则应考虑使用抽象工厂模式)。
前面已经介绍了简单工厂模式,简单工厂模式的缺点在于工厂类承载了太多的创建逻辑,当有新的产品需要创建时,需要去修改工厂类,增加case语句,这明显违反了开放-封闭原则。本文介绍的工厂模式能够解决该问题。
UML类图
还是借婚礼这个话题谈谈简单工厂模式,先上类图
同简单工厂的类图对比可知,工厂模式中创建具体婚礼类型交给子类ChineseWeddingFactory
和WesternWeddingFactory
来创建。
代码实现
抽象婚礼类, Wedding
/**
* <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
/**
* <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
/**
* <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
/**
* <p>文件描述: 婚礼工厂接口</p>
*
* @Author luanmousheng
* @Date 17/6/17 下午5:40
*/
public interface WeddingFactory {
Wedding selectWeddingStyle();
}
中式婚礼工厂类, ChineseWeddingFactory
/**
* <p>文件描述: 中式婚礼工厂类</p>
*
* @Author luanmousheng
* @Date 17/6/17 下午5:41
*/
public class ChineseWeddingFactory implements WeddingFactory {
@Override
public Wedding selectWeddingStyle() {
return new ChineseWedding();
}
}
西式婚礼工厂类, WesternWeddingFactory
/**
* <p>文件描述: 西式婚礼工厂类</p>
*
* @Author luanmousheng
* @Date 17/6/17 下午5:41
*/
public class WesternWeddingFactory implements WeddingFactory {
@Override
public Wedding selectWeddingStyle() {
return new WesternWedding();
}
}
Demo类, FactoryDemo
/**
* <p>文件描述: 工厂类Demo</p>
*
* @Author luanmousheng
* @Date 17/6/17 下午5:42
*/
public class FactoryDemo {
public static void main(String[] args) {
WeddingFactory factory = new WesternWeddingFactory();
Wedding westernWedding = factory.selectWeddingStyle();
westernWedding.setBridegroom("李文");
westernWedding.setBride("叶子");
westernWedding.kiss();
westernWedding.wed();
}
}
运行后结果如下
李文 kiss 叶子
新娘走过婚礼通道
证婚人致词
父母致词
新人婚礼誓言
交换戒指
喝交杯酒
优缺点
优点:当有新的产品时,不再需要修改工厂类,只要增加一个新的创建该产品的工厂类即可,遵守了对修改关闭,对扩展开放的原则。例如对于婚礼的例子,假如业务需要增加一个满族婚礼,新增MahchuWedding
和ManchuWeedingFactory
即可。
缺点:每增加一个产品就需要新增一个工厂类,也是挺麻烦的,以后再解决吧。