设计模式--简单工厂模式(1)

现实生活中,原始社会自给自足(没有工厂),农耕社会小作坊(简单工厂,民间酒坊),工业革命流水线(工厂方法,自产自销),现代产业链代工厂(抽象工厂,富士康)。我们的项目代码同样是由简到繁一步一步迭代而来的,但对于调用者来说,却越来越简单。

简单工厂定义

定义一个创建产品对象的工厂接口,将产品对象的实际创建工作推迟到具体子工厂类当中。这满足创建型模式中所要求的“创建与使用相分离”的特点。

我们把被创建的对象称为“产品”,把创建产品的对象称为“工厂”。如果要创建的产品不多,只要一个工厂类就可以完成,这种模式叫“简单工厂模式”。

在简单工厂模式中创建实例的方法通常为静态方法

优点与缺点

优点

  1. 工厂类包含必要的逻辑判断,可以决定在什么时候创建哪一个产品的实例。客户端可以免除直接创建产品对象的职责,很方便的创建出相应的产品。工厂和产品的职责区分明确
  2. 客户端无需知道所创建具体产品的类名,只需知道参数即可

缺点

  1. 简单工厂模式的工厂类单一,负责所有产品的创建,职责过重,一旦异常,整个系统将受影响。且工厂类代码会非常臃肿,违背高聚合原则
  2. 系统扩展困难,一旦增加新产品不得不修改工厂逻辑,在产品类型较多时,可能造成逻辑过于复杂
  3. 简单工厂模式使用了 static 工厂方法,造成工厂角色无法形成基于继承的等级结构。

应用场景

对于产品种类相对较少的情况,考虑使用简单工厂模式。使用简单工厂模式的客户端只需要传入工厂类的参数,不需要关心如何创建对象的逻辑,可以很方便地创建所需产品。

模式的结构与实现

简单工厂模式的主要角色

  • 简单工厂(SimpleFactory):是简单工厂模式的核心,负责实现创建所有实例的内部逻辑。工厂类的创建产品类的方法可以被外界直接调用,创建所需的产品对象。
  • 抽象产品(Product):是简单工厂创建的所有对象的父类,负责描述所有实例共有的公共接口。
  • 具体产品(ConcreteProduct):是简单工厂模式的创建目标。

直接输入1次#,并按下space后,将生成1级标题。
输入2次#,并按下space后,将生成2级标题。
以此类推,我们支持6级标题。有助于使用TOC语法后生成一个完美的目录。

结构图

简单工厂UML图

代码示例

类名对应角色
Furniture抽象产品(家具)
Desk具体产品(桌子)
Chair具体产品(椅子)
SimpleFactoryDM简单工厂

具体代码

/**
 *
 *
 * 对应角色 : 抽象产品(家具)
 *
 *
 * @author hanchao
 * @version 1.0
 * @date 2022/4/25 11:14
 */
public interface Furniture {

    void showName();
}
/**
 *
 * 对应角色 : 具体产品 (桌子)
 *
 * @author hanchao
 * @version 1.0
 * @date 2022/4/25 11:17
 */
public class Desk implements Furniture {

    @Override
    public void showName() {
        System.out.println("我是桌子");
    }
}
/**
 *
 * 对应角色 : 具体产品 (椅子)
 *
 * @author hanchao
 * @version 1.0
 * @date 2022/4/25 11:17
 */
public class Chair implements Furniture{

    @Override
    public void showName() {
        System.out.println("我是椅子");
    }
}
/**
 *
 * 简单工厂设计模式
 *
 * @author hanchao
 * @version 1.0
 * @date 2022/4/25 11:12
 */
public class SimpleFactoryDM {

    public static Furniture makeFurniture(String name){

        Furniture furniture = null;
        switch (name){
            case "desk":
                furniture = new Desk();
                break;
            case "chair":
                furniture = new Chair();
                break;
        }
        return furniture;
    }
}
/**
 * 
 * 测试类
 * 
 * @author hanchao
 * @version 1.0
 * @date 2022/4/25 11:21
 */
public class Client {

    public static void main(String[] args) {

        Furniture furniture = SimpleFactoryDM.makeFurniture("desk");
        furniture.showName();

        Furniture furniture1 = SimpleFactoryDM.makeFurniture("chair");
        furniture1.showName();
    }
}

摘抄 : http://c.biancheng.net/view/8385.html.

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值