资讯专栏INFORMATION COLUMN

设计模式(9)工厂模式(讲解+应用)

mushang / 2797人阅读

摘要:工厂模式就是用来创建对象,生产对象的。而现在,其全部依赖于工厂类,通过一个工厂类,实现解耦。应用实例实际设计中,工厂模式用的也是比较多,而且这种模式也会比较好辨识,带有。

目录

工厂模式

为什么使用工厂模式

应用实例

工厂模式

工厂模式:是一种常用的对象创建型设计模式,此模式的核心精神是封装类中不变的部分,提取其中个性化善变的部分为独立类,通过依赖注入以达到解耦、复用和方便后期维护拓展的目的。它的核心结构有四个角色,分别是抽象工厂;具体工厂;抽象产品;具体产品

这里所提到的依赖注入,对于依赖的创建思想又引出一个概念:依赖倒置即为高层组件不再依赖底层组件,而底层组件也不再依赖高层组件,而是出现一个工厂类,高底层组建依赖于这个工厂类。下面针对具体的例子来进行讲解。

为什么使用工厂模式

工厂,生产物品的地方。工厂模式就是用来创建对象,生产对象的。一般,我们会通过new来进行对象的创建,一旦通过new,那么就一定会有具体的实例出现,也就会使得该对象和当前类出现紧耦合,产生依赖,使得我们代码的可扩展性和灵活性都变低。继续我们上篇文章中工厂生产机器的例子。

//机器装配的基类
public abstract class Machine{
//机器装配的流程,final不可被复写,保证方装配算法不被破坏
    final void produce(){
        createFrame();
        addHead();
        addBody();
        if(ifDressup())
            dressUp();
    }
//创建框架
    public abstract void createFrame();
//添加一个机器头
    public abstract void addHead();
//添加一个机器的身子
    public abstract void addBody();
//为机器进行装扮
    public abstract void dressUp();
//判断是否为该机器进行装扮
    public boolean ifDressup(){
        return true;
    }

}
//继承自基类的一个子类
public class InflatableDoll extends Machine{
    public void createFrame(){
        System.out.println("This is a Frame");
    }

    public void addBody(){
        System.out.println("This is a body");
    }

    public void dressUp(){
        System.out.println("This is a beautiful cloth");
    }

}

这是我们通过模板方法创建来创建我们机器的一个例子,那么现在我们有了一个新的需求,我们要对这些所有的机器在出售的时候要进行一个包装,根据客户点的类型,然后对其进行相应的包装之后,然后才可以出售。不同机器的包装流程大致相似的,所以我们可以这样来写我们的前台销售部门。

public class Store{

    public void order(String type){
         Machine machine;
        if(type=="inflatedoll"){
            machine = new InflatableDoll();
        }else if(type==""){
            ....
        }
        machine.produce();
        machine.firstPack();
        machine.secondPack();
        machine.thirdPack();
        machine.fourthPack();
    }

}
public class InflatableDoll extends Machine{

    public void firstPack(){
        System.out.prinltn("Add first pack to protect");
    }

    public void secondPack(){
        System.out.prinltn("Add second pack to protect");
    }

    public void thirdPack(){
        System.out.prinltn("Add third pack to protect");
    }

    public void fourthPack(){
        System.out.prinltn("Add fourth pack to protect");
    }
}

但是问题来了,当我们的机器种类不断增多,对于机器类型的判断,然后创建会使得我们的代码变得很繁琐,而且灵活性很差,按照设计模式的原则,封装变化的,我们将对与机器类型的判断和机器的创建封装起来,我们该这个封装起来的类起了个名字叫做工厂类,因为这个工厂类是可以用来产生新的对象的。封装代码如下。

public class MachineFactory{
    public Machine create(String type){
        Machine machine;
        if(type=="inflatabledoll"){
            machine = new InflatableDoll();
        }else if(){
            do something;
        }
        machine.produce();
        return machine;
    }
}

通过这个工厂类,我们的商店出售类就可以改变了,和具体的机器实例实现解耦和。

public class Store{

    Store(){
        MachineFactory factory = new MachineFactory();
    }

    public void order(String type){
         Machine machine= factory.create(type);
        machine.firstPack();
        machine.secondPack();
        machine.thirdPack();
        machine.fourthPack();
    }
}

顿时就感觉代码简洁了好多,而且条理也变得很清晰了。
通过例子,再去对我们之前的概念去理解,就会变得清晰很多,抽象工厂,具体工厂,抽象产品,具体产品。依赖注入,依赖倒置。首先对于抽象工厂和具体的工厂的理解,因为我们不同的产品可能在其生产上还是存在一些差异,所以通过一个抽象工厂类作为基类,然后针对不同的地方分别建立不同的类,根据这些类,我们来创建我们相应的产品,为了实现商店类和产品的松耦合,我们定义一个抽象产品类,然后所有的产品都将从这个抽象类继承,然后实现自己的相应的方法,然后通过一个工厂类工厂方法注入实例,实例以委托的形式,来执行相应的操作。
依赖倒置:按照我们的传统思路,我们商店要出售商品,那么我们的商店就要依赖商品,而这里我们从底层的角度去向高层进阶,我们有商品,商品的创建需要一个工厂类,而商店类,则不再依赖于产品,产品也不再依赖于商店类,我们的第一种写法,在商店类中对于我们要创建的类进行的判断,我们就可以将其理解为商品对于商店类的依赖。而现在,其全部依赖于工厂类,通过一个工厂类,实现解耦。同时也使得之前的依赖出现了倒置,又高层依赖底层转为底层依赖高层。

应用实例

实际设计中,工厂模式用的也是比较多,而且这种模式也会比较好辨识,带有Factory。比如Android中的

public interface ThreadFactory {
    Thread newThread(Runnable r);
}

下篇更新状态模式

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/64623.html

相关文章

  • 深入理解控制反转(IoC)和依赖注入(DI)

    摘要:本文一大半内容都是通过举例来让读者去理解什么是控制反转和依赖注入,通过理解这些概念,来更加深入。这种由外部负责其依赖需求的行为,我们可以称其为控制反转。工厂模式,依赖转移当然,实现控制反转的方法有几种。 容器,字面上理解就是装东西的东西。常见的变量、对象属性等都可以算是容器。一个容器能够装什么,全部取决于你对该容器的定义。当然,有这样一种容器,它存放的不是文本、数值,而是对象、对象的描...

    HollisChuang 评论0 收藏0
  • 设计模式--静态工厂、简单工厂方法案例分析

    简介 1.学习本篇文章,了解简单工厂设计模式的使用场景。2.如何使用简单工厂模式。3.简单工厂模式能解决什么问题? 场景 现在有一家外卖小店需要从生产一份外卖开始进行考虑设计,当客户在网上点出不同味道的菜时,外卖小店就将按照不同的订单进行生产出菜品,然后进行打包、等待外卖小哥获取、赠送给客户等不同的几道工序,才算完成一单,但是后期由于生意很好,客户评价很高,有些地方的老板想加盟本店了,那么可能就会...

    BicycleWarrior 评论0 收藏0
  • php实现依赖注入(DI)和控制反转(IOC)

    摘要:工厂模式,依赖转移当然,实现控制反转的方法有几种。其实我们稍微改造一下这个类,你就明白,工厂类的真正意义和价值了。虽然如此,工厂模式依旧十分优秀,并且适用于绝大多数情况。 此篇文章转载自laravel-china,chongyi的文章https://laravel-china.org/top...原文地址: http://www.insp.top/learn-lar... ,转载务必保...

    tomato 评论0 收藏0
  • php设计模式

    摘要:我们今天也来做一个万能遥控器设计模式适配器模式将一个类的接口转换成客户希望的另外一个接口。今天要介绍的仍然是创建型设计模式的一种建造者模式。设计模式的理论知识固然重要,但 计算机程序的思维逻辑 (54) - 剖析 Collections - 设计模式 上节我们提到,类 Collections 中大概有两类功能,第一类是对容器接口对象进行操作,第二类是返回一个容器接口对象,上节我们介绍了...

    Dionysus_go 评论0 收藏0

发表评论

0条评论

mushang

|高级讲师

TA的文章

阅读更多
最新活动
阅读需要支付1元查看
<