【设计模式-3】简单工厂模式的代码实现及使用场景

 接上一篇:【设计模式-1】图文并茂:单例模式仅需要这一遍就够了,展示单例的使用场景及7种代码实现

 简单工厂模式并属于Gof 23个经典设计模式其中之一,只是通常会将它作为学习其他工厂设计模式的入门,而且在开发中,简单工厂模式也是比较常见的,设计思想比较简单。

1. 定义

简单工厂模式定义一个工厂类,提供获取对象的方法,根据入参的不同返回不同类的实例,通常被创建的实例对象都具有共同的父类,属于创建型模式

 在简单工厂模式中,包含3个角色,如下:

  • 抽象产品角色:它作为要生产所有产品的抽象父类,封装了各种产品对象的共有方法,抽象产品角色的引入可以提高系统的灵活性,使得工厂类可以定义统一的返回值类型。
  • 具体产品角色:它是简单工厂的创建产品,所有被工厂创建的对象都是抽象产品的子类实例。
  • 工厂角色:工厂类是简单工厂模式的核心,负责实现创建产品的逻辑,它提供产品创建的方法,返回类型是抽象产品,可以被外部new,也可以通过工具类的形式调用。

2. 代码实现

 简单工厂模式代码实现比较简单,我们举个例子,某个需求要求根据客户要求生产不同类型的笔,有铅笔,钢笔,毛笔。代码如下:

  • 抽象的产品角色
// 1.抽象的产品角色
public abstract class Pen {
    // 共有的业务方法:书写
    protected abstract void write();
}
  • 具体的产品角色
// 2.具体的产品角色-铅笔
class Pencil extends Pen {
    @Override
    protected void write() {
        System.out.println("写铅笔字!");
    }
}
// 2.具体的产品角色-钢笔
class FountainPen extends Pen {
    @Override
    protected void write() {
        System.out.println("写钢笔字!");
    }
}
// 2.具体的产品角色-毛笔
class BrushPen extends Pen {
    @Override
    protected void write() {
        System.out.println("写毛笔字!");
    }
}
  • 工厂角色
// 3.工厂角色
class PenFactory {
    // 生成具体产品角色的方法
    public static Pen createPen(String type) {
        switch (type) {
            case "pencil" :
                return new Pencil();
            case "fountainPen" :
                return new FountainPen();
            case "brushPen" :
                return new BrushPen();
            default:
                return null;
        }
    }
}
  • 客户端
class Client {
    public static void main(String[] args) {
        Pen pencil = PenFactory.createPen("pencil");
        pencil.write();
        Pen fountainPen = PenFactory.createPen("fountainPen");
        fountainPen.write();
    }
}

3.UML类图

 简单工厂模式的类图也比较简单,如下图:
在这里插入图片描述


4. 简化

 有时候为了简化简单工厂模式,可以将抽象产品角色和工厂类结合,将生产具体产品的静态方法放在抽象产品角色中实现,代码如下:

// 1.抽象的产品角色
public abstract class Pen {
    // 共有的业务方法:书写
    protected abstract void write();
	// 生成具体产品的方法
    public static Pen createPen(String type) {
        switch (type) {
            case "pencil" :
                return new Pencil();
            case "fountainPen" :
                return new FountainPen();
            case "brushPen" :
                return new BrushPen();
            default:
                return null;
        }
    }
}
// 2.具体的产品角色-铅笔
class Pencil extends Pen {
    @Override
    protected void write() {
        System.out.println("写铅笔字!");
    }
}
// 2.具体的产品角色-钢笔
class FountainPen extends Pen {
    @Override
    protected void write() {
        System.out.println("写钢笔字!");
    }
}
// 2.具体的产品角色-毛笔
class BrushPen extends Pen {
    @Override
    protected void write() {
        System.out.println("写毛笔字!");
    }
}
// 3.客户端
class Client {
    public static void main(String[] args) {
        Pen pencil = Pen.createPen("pencil");
        pencil.write();
        Pen fountainPen = Pen.createPen("fountainPen");
        fountainPen.write();
    }
}

5. 总结

5.1 优点

  • 如所有工厂模式一样,简单工模式实现了对象的创建和使用过程分离,进一步解耦;
  • 客户端无需知道对象的创建过程,只需知道所需产品的对应的类型参数即可;
  • 通过一些配置文件及反射机制,可以更换生产的具体产品对象,提高系统的灵活性

5.2 缺点

  • 工厂类集中了所有了产品对象的创建逻辑,职责过重,如果产品类型较多,代码可读性降低;
  • 简单工厂类的引入增加了类的个数,变相的增加了系统的复杂度和理解难度;
  • 增加新的具体产品角色时,需要修改工厂类的代码,违反了开闭原则,不利于系统扩展;
  • 简单工厂模式所有具体产品角色都与工厂类耦合,无法对工厂类进行高层抽象,不利于扩展和维护。

5.3 适用场景

  • 工厂类创建的对象比较少且比较明确,未来不会扩展新的产品角色类型;
  • 客户端只关系创建对象的入参类型,不关心对象的创建过程;

 下一遍链接:【设计模式-3】工厂方法模式的代码实现及使用场景

  • 0
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值