精华内容
下载资源
问答
  • 抽象工厂模式和工厂方法模式区别

    万次阅读 2016-03-04 09:48:57
     个人觉得这个区别在于产品,如果产品单一,最合适用工厂模式,但是如果有多个业务品种、业务分类时,通过抽象工厂模式产生需要的对象是一种非常好的解决方式。再通俗深化理解下:工厂模式针对的是一个产品等级结构...

    首先来看看这两者的定义区别:

    工厂模式:定义一个用于创建对象的借口,让子类决定实例化哪一个类

    抽象工厂模式:为创建一组相关或相互依赖的对象提供一个接口,而且无需指定他们的具体类

           个人觉得这个区别在于产品,如果产品单一,最合适用工厂模式,但是如果有多个业务品种、业务分类时,通过抽象工厂模式产生需要的对象是一种非常好的解决方式。再通俗深化理解下:工厂模式针对的是一个产品等级结构 ,抽象工厂模式针对的是面向多个产品等级结构的。

    再来看看工厂方法模式与抽象工厂模式对比:

     

    工厂方法模式

    抽象工厂模式

    针对的是一个产品等级结构针对的是面向多个产品等级结构
    一个抽象产品类多个抽象产品类
    可以派生出多个具体产品类每个抽象产品类可以派生出多个具体产品类
    一个抽象工厂类,可以派生出多个具体工厂类一个抽象工厂类,可以派生出多个具体工厂类
    每个具体工厂类只能创建一个具体产品类的实例每个具体工厂类可以创建多个具体产品类的实例

                                      

    举个例子说明下:

    用种蔬菜的例子来说明事实,最初的时候,由于规模小,只种植一种蔬菜,根菜类蔬菜,这个时候由于种植方式比较简单,采用简单工厂模式即可,主要目的是让工人轻松,下达工厂种植即可,但是随着种植厂的发展以及市场的需求,要增加一种蔬菜类型种植了,茎菜,由于茎菜与根菜种植方式不一致,就需要两个专门的种植工厂来进行管理,那么久采用工厂模式来管理,一个工厂负责一种作物的种植,这个时候产品可以理解为仍然在一个层次。但是随着科技的发展,我们逐步要种植转基因与非转基因食品了,在以前的蔬菜种类上又增加了一个层次,这个时候无法将其作为一个层次来解决,所以必须采用抽象工厂的方式来解决。我用UML图表示三种结构:

    1

     11    上面的UML图很明显的就看出来了,抽象工厂可以创建多个产品类对象,如在种菜工厂中,有种根菜,种茎菜。工厂模式与抽象工厂模式以及简单工厂模式只有在具体应用的时候,分析具体的产品层级,然后选择相应的设计模式。

        而在没一个层次,种菜工人所关心的对象也不一样,在简单工厂模式下,工人要想到种植萝卜还是白菜,在工厂模式下,工人想到是种植根菜还是茎菜,而在抽象工厂模式下,则关心种植基因菜还是非基因菜

    展开全文
  • 工厂方法模式和抽象工厂模式
  • 抽象工厂模式抽象工厂模式抽象工厂模式抽象工厂模式抽象工厂模式抽象工厂模式
  • 主要介绍了Java设计模式编程中的工厂方法模式和抽象工厂模式,设计模式的建立有利于团队协作时代码的共同维护,需要的朋友可以参考下
  • 介绍的是工厂模式 包括简单工厂模式、工厂方法模式、抽象工厂模式 包括PPT代码
  • 用java语言实现工厂方法模式和抽象工厂模式
  • 设计模式 - 创建型模式 - 抽象工厂模式(Java)

    万次阅读 多人点赞 2019-02-02 15:16:02
    下面就是我们要说的产品族的概念,它代表了组成某个产品的一系列附件的集合: 当涉及到这种产品族的问题的时候,就需要抽象工厂模式来支持了。我们不再定义 CPU 工厂、主板工厂、硬盘工厂、显示屏工厂等等,我们...

    分享一个大牛的人工智能教程。零基础!通俗易懂!风趣幽默!希望你也加入到人工智能的队伍中来!请点击http://www.captainbed.net 

    当涉及到产品族的时候,就需要引入抽象工厂模式了。

    一个经典的例子是造一台电脑。我们先不引入抽象工厂模式,看看怎么实现。

    因为电脑是由许多的构件组成的,我们将 CPU 和主板进行抽象,然后 CPU 由 CPUFactory 生产,主板由 MainBoardFactory 生产,然后,我们再将 CPU 和主板搭配起来组合在一起,如下图:

    这个时候的客户端调用是这样的:

    // 得到 Intel 的 CPU
    CPUFactory cpuFactory = new IntelCPUFactory();
    CPU cpu = intelCPUFactory.makeCPU();
    
    // 得到 AMD 的主板
    MainBoardFactory mainBoardFactory = new AmdMainBoardFactory();
    MainBoard mainBoard = mainBoardFactory.make();
    
    // 组装 CPU 和主板
    Computer computer = new Computer(cpu, mainBoard);

     单独看 CPU 工厂和主板工厂,它们分别是前面我们说的工厂模式。这种方式也容易扩展,因为要给电脑加硬盘的话,只需要加一个 HardDiskFactory 和相应的实现即可,不需要修改现有的工厂。

    但是,这种方式有一个问题,那就是如果 Intel 家产的 CPU 和 AMD 产的主板不能兼容使用,那么这代码就容易出错,因为客户端并不知道它们不兼容,也就会错误地出现随意组合。

    下面就是我们要说的产品族的概念,它代表了组成某个产品的一系列附件的集合:

    当涉及到这种产品族的问题的时候,就需要抽象工厂模式来支持了。我们不再定义 CPU 工厂、主板工厂、硬盘工厂、显示屏工厂等等,我们直接定义电脑工厂,每个电脑工厂负责生产所有的设备,这样能保证肯定不存在兼容问题。

    这个时候,对于客户端来说,不再需要单独挑选 CPU厂商、主板厂商、硬盘厂商等,直接选择一家品牌工厂,品牌工厂会负责生产所有的东西,而且能保证肯定是兼容可用的。

    public static void main(String[] args) {
    
        // 第一步就要选定一个“大厂”
        ComputerFactory cf = new AmdFactory();
    
        // 从这个大厂造 CPU
        CPU cpu = cf.makeCPU();
    
        // 从这个大厂造主板
        MainBoard board = cf.makeMainBoard();
    
        // 从这个大厂造硬盘
        HardDisk hardDisk = cf.makeHardDisk();
    
        // 将同一个厂子出来的 CPU、主板、硬盘组装在一起
        Computer result = new Computer(cpu, board, hardDisk);
    }

    当然,抽象工厂的问题也是显而易见的,比如我们要加个显示器,就需要修改所有的工厂,给所有的工厂都加上制造显示器的方法。这有点违反了对修改关闭,对扩展开放这个设计原则。

    展开全文
  • 简单工厂模式,工厂方法模式和抽象工厂模式的异同  简单工厂模式,工厂方法模式和抽象工厂模式都是属于创建型设计模式,这三种创建型模式都不需要知道具体类。我们掌握一种思想,就是在创建一个对象时,需要把容易...
    简单工厂模式,工厂方法模式和抽象工厂模式的异同 
    

    简单工厂模式,工厂方法模式和抽象工厂模式都是属于创建型设计模式,这三种创建型模式都不需要知道具体类。我们掌握一种思想,就是在创建一个对象时,需要把容易发生变化的地方给封装起来,来控制变化(哪里变化,封装哪里),以适应客户的变动,项目的扩展。用这三种设计模式都可以实现,那究竟这三种设计模式有什么异同呢?下面根据这三者之间的特点,优点,缺点,适用范围进行比较。

     

    一.特点 

    简单工厂模式:专门定义一个类来负责创建其他类的实例,被创建的实例通常都具有共同的父类。它又称为静态工厂方法模式。它的实质是由一个工厂类根据传入的参数,动态决定应该创建哪一个产品类(这些产品类继承自一个父类或接口)的实例。简单工厂模式的创建目标,所有创建的对象都是充当这个角色的某个具体类的实例。在这个模式中,工厂类是整个模式的关键所在。它包含必要的判断逻辑,能够根据外界给定的信息,决定究竟应该创建哪个具体类的对象。用户在使用时可以直接根据工厂类去创建所需的实例,而无需了解这些对象是如何创建以及如何组织的。有利于整个软件体系结构的优化。 


    工厂方法模式:工厂方法是粒度很小的设计模式,因为模式的表现只是一个抽象的方法。提前定义用于创建对象的接口,让子类决定实例化具体的某一个类,即在工厂和产品中间增加接口,工厂不再负责产品的创建,由接口针对不同条件返回具体的类实例,由具体类实例去实现。工厂方法模式是简单工厂模式的衍生,解决了许多简单工厂模式的问题。首先完全实现‘开-闭 原则’,实现了可扩展。其次实现更复杂的层次结构,可以应用于产品结果复杂的场合。工厂方法模式是对简单工厂模式进行了抽象。有一个抽象的Factory类(可以是抽象类和接口),这个类将不在负责具体的产品生产,而是只制定一些规范,具体的生产工作由其子类去完成。在这个模式中,工厂类和产品类往往可以依次对应。即一个抽象工厂对应一个抽象产品,一个具体工厂对应一个具体产品,这个具体的工厂就负责生产对应的产品。  


    抽象工厂模式:抽象工厂模式是所有形态的工厂模式中最为抽象和最具一般性的一种形态。抽象工厂模式是指当有多个抽象角色时,使用的一种工厂模式。抽象工厂模式可以向客户端提供一个接口,使客户端在不必指定产品的具体的情况下,创建多个产品族中的产品对象。它有多个抽象产品类,每个抽象产品类可以派生出多个具体产品类,一个抽象工厂类,可以派生出多个具体工厂类,每个具体工厂类可以创建多个具体产品类的实例。每一个模式都是针对一定问题的解决方案,工厂方法模式针对的是一个产品等级结构;而抽象工厂模式针对的是多个产品等级结果。 

    其中抽象工厂和工厂方法很类似,区别如下: 

     工厂方法模式: 
    一个抽象产品类,可以派生出多个具体产品类。    

    一个抽象工厂类,可以派生出多个具体工厂类。    

    每个具体工厂类只能创建一个具体产品类的实例。  

    抽象工厂模式: 

    多个抽象产品类,每个抽象产品类可以派生出多个具体产品类。    

    一个抽象工厂类,可以派生出多个具体工厂类。    

    每个具体工厂类可以创建多个具体产品类的实例。       

     区别: 
    工厂方法模式只有一个抽象产品类,而抽象工厂模式有多个。    
    工厂方法模式的具体工厂类只能创建一个具体产品类的实例,而抽象工厂模式可以创建多个 

    二.优点 

    简单工厂模式:工厂类含有必要的判断逻辑,可以决定在什么时候创建哪一个产品类的实例,客户端可以免除直接创建产品对象的责任,而仅仅"消费"产品。简单工厂模式通过这种做法实现了对责任的分割。简单工厂模式能够根据外界给定的信息,决定究竟应该创建哪个具体类的对象。通过它,外界可以从直接创建具体产品对象的尴尬局面中摆脱出来。外界与具体类隔离开来,偶合性低。明确区分了各自的职责和权力,有利于整个软件体系结构的优化。 
    工厂方法模式:工厂方法模式是为了克服简单工厂模式的缺点(主要是为了满足OCP)而设计出来的。简单工厂模式的工厂类随着产品类的增加需要增加很多方法(或代码),而工厂方法模式每个具体工厂类只完成单一任务,代码简洁。工厂方法模式完全满足OCP,即它有非常良好的扩展性。 
    抽象工厂模式:抽象工厂模式主要在于应对“新系列”的需求变化。分离了具体的类,抽象工厂模式帮助你控制一个应用创建的对象的类,因为一个工厂封装创建产品对象的责任和过程。它将客户和类的实现分离,客户通过他们的抽象接口操纵实例,产品的类名也在具体工厂的实现中被分离,它们不出现在客户代码中。它使得易于交换产品系列。一个具体工厂类在一个应用中仅出现一次——即在它初始化的时候。这使得改变一个应用的具体工厂变得很容易。它只需改变具体的工厂即可使用不同的产品配置,这是因为一个抽象工厂创建了一个完整的产品系列,所以整个产品系列会立刻改变。它有利于产品的一致性。当一个系列的产品对象被设计成一起工作时,一个应用一次只能使用同一个系列中的对象,这一点很重要,而抽象工厂很容易实现这一点。抽象工厂模式有助于这样的团队的分工,降低了模块间的耦合性,提高了团队开发效率。 


    三.缺点 

    简单工厂模式:当产品有复杂的多层等级结构时,工厂类只有自己,以不变应万变,就是模式的缺点。因为工厂类集中了所有产品创建逻辑,一旦不能正常工作,整个系统都要受到影响。系统扩展困难,一旦添加新产品就不得不修改工厂逻辑,有可能造成工厂逻辑过于复杂,违背了"开放--封闭"原则(OCP).另外,简单工厂模式通常使用静态工厂方法,这使得无法由子类继承,造成工厂角色无法形成基于继承的等级结构。 

    工厂方法模式:不易于维护,假如某个具体产品类需要进行一定的修改,很可能需要修改对应的工厂类。当同时需要修改多个产品类的时候,对工厂类的修改会变得相当麻烦(对号入座已经是个问题了)。 

    抽象工厂模式:抽象工厂模式在于难于应付“新对象”的需求变动。难以支持新种类的产品。难以扩展抽象工厂以生产新种类的产品。这是因为抽象工厂几乎确定了可以被创建的产品集合,支持新种类的产品就需要扩展该工厂接口,这将涉及抽象工厂类及其所有子类的改变。 


    四.适用范围 

    简单工厂模式:工厂类负责创建的对象比较少,客户只知道传入了工厂类的参数,对于始何创建对象(逻辑)不关心。 
    工厂方法模式:当一个类不知道它所必须创建对象的类或一个类希望由子类来指定它所创建的对象时,当类将创建对象的职责委托给多个帮助子类中的某一个,并且你希望将哪一个帮助子类是代理者这一信息局部化的时候,可以使用工厂方法。 
    抽象工厂模式:一个系统不应当依赖于产品类实例如何被创建、组合和表达的细节,这对于所有形态的工厂模式都是重要的。这个系统有多于一个的产品族,而系统只消费其中某一产品族。同属于同一个产品族的产品是在一起使用的,这一约束必须在系统的设计中体现出来。系统提供一个产品类的库,所有的产品以同样的接口出现,从而使客户端不依赖于实现。 
    其实,无论是简单工厂模式、工厂模式还是抽象工厂模式,它们本质上都是将不变的部分提取出来,将可变的部分留作接口,以达到最大程度上的复用。究竟用哪种设计模式更适合,这要根据具体的业务需求来决定。
    展开全文
  • 从简单工厂,到工厂方法抽象工厂,这几种都带有“工厂”的模式,总是容易叫人迷糊,我仔细研究了下,然后用简单的例子做类比,列出了自己的通俗理解比较,大部分是自己的体会,感觉理的比较清楚,末尾提了下...
  • 包括简单工厂,工厂方法模式,抽象工厂模式三个demo,帮你更好的创建对象
  • 代码详解工厂方法模式和抽象工厂模式 工厂方法模式 定义一个用于创建对象的接口,让子类决定实例化哪一个类,使一个类的实例化延迟到其子类 类图 具体代码 以生产鼠标为例, 有一个抽象的鼠标工厂,工厂有两个...

    代码详解工厂方法模式和抽象工厂模式

    工厂方法模式

    定义一个用于创建对象的接口,让子类决定实例化哪一个类,使一个类的实例化延迟到其子类

    类图

    2. 工厂方法模式(Factory Method Pattern) — Graphic Design Patterns

    具体代码

    以生产鼠标为例, 有一个抽象的鼠标工厂,工厂有两个实现,一个是戴尔鼠标工厂,一个是联想鼠标工厂,具体的抽象工厂子类,负责决定生产那种鼠标,将类的实例化延迟到了子类

    抽象的鼠标工厂类

    abstract class MouseFactory{
        //抽象方法
        abstract Mouse createMouse();
    }
    

    抽象工厂的具体实现类,也就是其子类

    class DeilMouseFactory extends MouseFactory{
        public Mouse createMouse(){
            return new DeilMouse();
        }
    }
    class LenovoMouseFactory extends MouseFactory{
        public Mouse createMouse(){
            return new LenovoMouse();
        }
    }
    

    鼠标的抽象类,和具体的实现,比如戴尔鼠标,联想鼠标

    abstract class Mouse{
        abstract String getName();
    }
    class DeilMouse extends Mouse{
        public String getName(){
            return "DeilMouse";
        }
    }
    class LenovoMouse extends Mouse{
        public String getName(){
            return "LenovoMouse";
        }
    }
    

    抽象工厂模式

    提供一个创建一系列相关或者相互依赖对象的接口,而无需指定他们具体的类

    类图

    具体代码

    上面的例子是生产鼠标,现在这个例子是生产PC。有一个抽象的PC工厂,主要两个抽象方法,一个生产鼠标,一个生产键盘。PC工厂的具体实现有戴尔工厂,联想工厂。各自生产自己类型的鼠标和键盘

    abstract class PCFactory{
        //抽象方法
        abstract Mouse createMouse();
        abstract KeyBoard createKeyBoard();
    }
    class DeilPCFactory extends PCFactory{
        public Mouse createMouse(){
            return new DeilMouse();
        }
        public KeyBoard createKeyBoard(){
            return new DeilKeyBoard();
        }
    }
    
    class LenovoPCFactory extends PCFactory{
        public Mouse createMouse(){
            return new LenovoMouse();
        }
        public KeyBoard createKeyBoard(){
            return new LenovoKeyBoard();
        }
    }
    

    通过阅读上面的源码,或许你发现了,如果只有一个产品,抽象工厂模式直接退化为工厂方法模式。

    参考文章

    抽象工厂模式和工厂模式的区别? - 名姓的回答 - 知乎

    展开全文
  • 简单工厂模式、工厂方法模式和抽象工厂模式都是设计模式中创建型的经典方法,各有千秋,各有用物之地啊。简单工厂,主要用生产对象不能抽象为一个类,或者是面向较小的群体没有必要进行抽象封装。说白了就是通过简单...
  • 工厂方法模式和抽象工厂模式的区别,对工厂方法模式和抽象工厂模式做了简单的比较
  • Java实现的工厂模式抽象工厂,工厂方法模式
  • 1、抽象工厂模式+反射技术 2、抽象工厂模式+简单工厂模式 3、仅仅是抽象工厂模式
  • Java设计模式—工厂方法模式&抽象工厂模式

    万次阅读 多人点赞 2016-09-11 15:07:17
    (尊重劳动成果,转载请注明出处:https://blog.csdn.net/qq_25827845/article/details/52503884冷血之心的博客) 目录 工厂方法模式: 通用类图如下: 抽象产品类: 具体产品类 ...抽象工厂模式...
  • 设计模式系列(七)简单工厂模式、工厂方法模式和抽象工厂模式对比  在前面的三篇文章中,依次讲解了简单工厂模式、工厂方法模式和抽象工厂模式,这篇文章主要对其进行简单的对比概括,详细部分大家可以参考...
  • 简单工厂模式&工厂方法模式&抽象工厂模式的区别及优缺点及使用场景简单工厂普通简单...工厂模式在一些设计模式的书中分为简单工厂模式,工厂方法模式和抽象工厂模式三类。也有把工...
  • 文章目录简单工厂(非模式,像编程习惯)工厂方法模式抽象工厂模式 除了使用new操作符之外,还有更多制造对象的方法。你将了解到实例化这个活动不应该总是公开的进行,也会认识到初始化经常造成“耦合”问题。 简单...
  • 熵增教育-熵增学院VIP精品课程录播:简单工厂模式-工厂方法模式-抽象工厂模式
  • 一、概念及类图1、简单工厂模式(静态工厂模式) 在简单工厂模式中,工厂类可以根据参数的不同返回不同的类的实例。 2、工厂方法模式(多态模式) 工厂方法模式的核心是抽象工厂类Factory,...3、抽象工厂模式 该模式
  • 简单工厂模式工厂方法模式抽象工厂模式
  • 工厂方法模式定义: 即定义一个创建对象的接口(即抽象工厂类),让其子类(具体工厂类)决定实例化哪一个类(具体产品类)。...1,抽象工厂类:工厂方法模式的核心,定义一个创建对象的接口 2,具体工厂类
  • 主要介绍了JavaScript设计模式之工厂模式和抽象工厂模式,结合实例形式分析了工厂模式的功能、定义、相关问题解决方法,并分析抽象工厂模式与工厂模式的不同之处,需要的朋友可以参考下
  • 工厂方法模式与抽象工厂模式

    千次阅读 2015-02-13 22:45:16
    抽象工厂模式与工厂方法模式的区别  可以这么说,工厂方法模式是一种极端情况的抽象工厂模式,而抽象工厂模式可以看成是工厂方法模式的一种推广。 (1)、其实工厂方法模式是用来创建一个产品的等级结构的,而抽象...
  • 抽象工厂模式,工厂方法模式区别

    千次阅读 2015-11-29 12:50:59
    抽象工厂模式 ...一、本节目标我们本节课程主要介绍【抽象工厂模式】的相关知识,将会涉及以下内容: 什么是抽象工厂模式 ... 工厂方法模式、抽象工厂模式区别 二、什么是 抽象工厂模式抽象工厂模式(Abstract Fact
  • 工厂模式三部曲-抽象工厂模式

    千次阅读 2016-05-29 00:11:11
    抽象工厂模式和工厂方法模式很相似,但是抽象工厂模式将抽象发挥的更加极致,是三种工厂模式中最抽象的一种设计模式。抽象工厂模式,也叫做Kit模式,提供了创建一系列相关抽象子类的接口,而无需指定它们具体的类型...
  • 关于简单工厂模式,工厂方法模式,抽象工厂模式的一次总结 模式 定义 简单工厂模式 定义一个工厂类,它可以根据参数的不同返回不同类的实例,被创建的实例通常都具有共同的父类。 工厂方法模式 定义一个...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 167,200
精华内容 66,880
关键字:

抽象工厂模式和工厂方法