简单工厂模式

最近工作中使用到了简单工厂模式,留个笔记记录下;

优点和缺点
优点:
工厂类包含必要的逻辑判断,可以决定在什么时候创建哪一个产品的实例。客户端可以免除直接创建产品对象的职责,很方便的创建出相应的产品。工厂和产品的职责区分明确。
客户端无需知道所创建具体产品的类名,只需知道参数即可。 也可以引入配置文件,在不修改客户端代码的情况下更换和添加新的具体产品类。
缺点:
简单工厂模式的工厂类单一,负责所有产品的创建,职责过重,一旦异常,整个系统将受影响。且工厂类代码会非常臃肿,违背高聚合原则。
使用简单工厂模式会增加系统中类的个数(引入新的工厂类),增加系统的复杂度和理解难度
系统扩展困难,一旦增加新产品不得不修改工厂逻辑,在产品类型较多时,可能造成逻辑过于复杂 简单工厂模式使用了 static
工厂方法,造成工厂角色无法形成基于继承的等级结构。
应用场景:
对于产品种类相对较少的情况,考虑使用简单工厂模式。使用简单工厂模式的客户端只需要传入工厂类的参数,不需要关心如何创建对象的逻辑,可以很方便地创建所需产品 。

模式的结构与实现 简单工厂模式的主要角色如下:
简单工厂(SimpleFactory):
是简单工厂模式的核心,负责实现创建所有实例的内部逻辑。工厂类的创建产品类的方法可以被外界直接调用,创建所需的产品对象。
抽象产品(Product):
是简单工厂创建的所有对象的父类,负责描述所有实例共有的公共接口。
具体产品(ConcreteProduct):
是简单工厂模式的创建目标。
这些是网上找到的解释; 我的实际应用是根据不同的设备热点ID 匹配对应的锁,每把锁的设备开锁方式不同

抽象产品(Product)

public interface Lock {
    /*
     * 锁舌缩入
     * 1 开门成功
     * 0 开门失败
     */
    int openLock();
    /*
     * 锁舌伸出
     * 1 关门成功
     * 0 关门失败
     */
    int closeLock();
    /*
     * 感应磁片状态
     * 1 门磁移出
     * 0 门磁移入
     */
    int getLockDoor();
    /*
     * 感应锁舌状态
     * 1 锁舌收缩
     * 0 锁舌伸出
     */
    int getLock();
}

具体产品(ConcreteProduct);

public class SM110Lock implements Lock {

    @Override
    public int openLock() {
        //这里是具体的逻辑代码......
    }

    @Override
    public int closeLock() {
          //这里是具体的逻辑代码......
    }

    @Override
    public int getLockDoor() {
           //这里是具体的逻辑代码......
    }

    @Override
    public int getLock() {
         //这里是具体的逻辑代码......
    }
}
public class SM112BLock implements Lock {
    @Override
    public int openLock() {
     //这里是具体的逻辑代码......
        return 0;
    }

    @Override
    public int closeLock() {
     //这里是具体的逻辑代码......
        return 0;
    }

    @Override
    public int getLockDoor() {
     //这里是具体的逻辑代码......
        return 0;
    }

    @Override
    public int getLock() {
     //这里是具体的逻辑代码......
        return 0;
    }
}

简单工厂(SimpleFactory):

public class LockFactory {
    public static Lock getLockObject(String id){
        if (id.contains("SM00A")){
            return new SM110Lock();
        }else if (id.contains("SM00B")){
            return new SM112BLock();
        }else if (id.contains("SM00C")){
            return new SM119BLock();
        }
        return null;
    }
}

使用

//直接调用就可以获取对应的实例对象了.
LockFactory .getLockObject("SM00A00000")
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值