设计模式-工厂模式

什么是工厂模式?

工厂模式是一种对象创建型模式,顾名思义,它改变了对象新建这一步骤的方式,最直白的体现就是,我们正常情况下,新建一个对象时,采用:

User user=new User();

而在工厂模式中,我们通过调用工厂方法实现对象的创建。
简单工厂模式(静态工厂模式)
由一个工厂对象决定创建出哪一种产品类的实例。客户端只需要传入工厂类的参数,无需关心如何创建对象的细节

/**
 * 简单的静态工厂
 */
public class FactoryPattern {
    public static Goods createGoods(String type) {
        if (type.equals("A")) {
        //根据传入类型,创建对应类型的商品
            return new GoodsA();
        }  else {
            return null;
        }
    }
}

工厂方法模式(多态性工厂模式)
定义一个用于创建对象的接口,让子类决定实例化哪一个类。工厂方法模式是将对象的实例化延迟到其子类中进行,从而实现解耦。

public interface FactoryMethodPattern {
    /**
     * 定义创建方法,由子类实现,从而实现解耦
     * @return
     */
    public  Goods createGoods();
}

子类实现

public class FactoryMethodPatternA implements FactoryMethodPattern{
    @Override
    public Goods createGoods() {
        return new GoodsA();
    }
}

调用时

 FactoryMethodPattern factoryMethodPattern=new FactoryMethodPatternA();
 Goods goods=factoryMethodPattern.createGoods();

抽象工厂模式
抽象工厂模式是指提供一个创建一系列相关或相互依赖对象的接口,而无需指定它们具体的类.

//提供多个抽象接口
public interface  AbstractFactory {
    Goods createGoods();
    GoodsA createGoodsA();
}

接口实现上更加灵活

public class ConAbstractFactory implements AbstractFactory{
    @Override
    public Goods createGoods() {
        return new GoodsA();
    }

    @Override
    public GoodsA createGoodsA() {
        return new GoodsA();
    }
}

工厂模式的优缺点

优点
创建过程被统一化处理,实现了创建和使用的分离;
而抽象工厂和工厂方法模式在灵活性上更好,更便于维护扩展;
缺点
简单工厂模式灵活性较差,不利于扩展,新增新的对象就要修改代码;对象较多时,判断会很多,不利于维护;
工厂方法创建了更多的类,这在对象较多时,就需要更多的工厂来生产对应的对象;
抽象工厂方法可读性较差,因为类的关系上较为复杂。

工厂模式的应用场景

基于工厂模式的特点,我们可以总结出适用场景。
1.需要依赖具体环境创建不同实例,这些实例都有相同的行为,这时候我们可以使用工厂模式,简化实现的过程,同时也可以减少每种对象所需的代码量,有利于消除对象间的耦合,提供更大的灵活性;
2.系统中存在较大对象的强耦合关系时。
3.多个存在相同元素但又存在细节差异的对象的new方法。
那么,具体的应用场景由哪些呢?
资源管理:如文件资源、数据库资源、网络资源等等一类需要不同的创建方法的。
消息队列:当你需要在一个系统中使用不同的消息队列时。
日志记录:系统中可能存在多种类型的日志记录需求,这时候可以使用工厂模式。
还有很多实际的应用场景,可以多尝试,学会灵活应用才是王道,生搬硬套要不得。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值