工厂模式

本文通过婚礼主题详细介绍工厂模式的设计思想及其实现方式。相较于简单工厂模式,工厂模式将具体产品的创建逻辑交由子类负责,更好地遵循了开放-封闭原则。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

设计模式-工厂模式

工厂模式,定义一个用于创建对象的接口,让子类决定具体实例化哪个类。工厂模式适用于只有一种抽象产品的情景,具体产品可以有多个(如果存在多个抽象产品的情景,则应考虑使用抽象工厂模式)。

前面已经介绍了简单工厂模式,简单工厂模式的缺点在于工厂类承载了太多的创建逻辑,当有新的产品需要创建时,需要去修改工厂类,增加case语句,这明显违反了开放-封闭原则。本文介绍的工厂模式能够解决该问题。

UML类图

还是借婚礼这个话题谈谈简单工厂模式,先上类图
这里写图片描述

同简单工厂的类图对比可知,工厂模式中创建具体婚礼类型交给子类ChineseWeddingFactoryWesternWeddingFactory来创建。

代码实现

抽象婚礼类, 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 叶子
新娘走过婚礼通道
证婚人致词
父母致词
新人婚礼誓言
交换戒指
喝交杯酒

优缺点

优点:当有新的产品时,不再需要修改工厂类,只要增加一个新的创建该产品的工厂类即可,遵守了对修改关闭,对扩展开放的原则。例如对于婚礼的例子,假如业务需要增加一个满族婚礼,新增MahchuWeddingManchuWeedingFactory即可。

缺点:每增加一个产品就需要新增一个工厂类,也是挺麻烦的,以后再解决吧。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值