美文网首页java的工厂模式设计模式
Java工厂模式详解--学习笔记

Java工厂模式详解--学习笔记

作者: 在挖坑的猿 | 来源:发表于2017-10-17 11:35 被阅读0次
    • 目录
      • 1.概念
      • 2.角色
      • 3.工厂执行的具体流程
        • 简单工厂模式(静态工厂方法)
        • 工厂模式
        • 抽象工厂模式
      • 4.分类
      • 5.总结
      • 6.学习参考

    1.概念

      简单来说工厂模式就是帮助我们创建对象,隐藏了对象创建过程的复杂度(如类B需要调用类A,工厂类提供A类的创建接口,B只需要调用接口传入相应参数即可)、避免你辛苦的准备构造方法的参数。说白了--就是工厂提供产品给客户(按照提供的方式不同分成三类:简单工厂、工厂、抽象工厂) 具体简介看下面:

    大致流程

    工厂模式是我们最常用的实例化对象模式了,是用工厂方法代替new操作的一种模式。著名的Jive论坛 ,就大量使用了工厂模式,工厂模式在Java程序系统可以说是随处可见。因为工厂模式就相当于创建实例对象的new,我们经常要根据类Class生成实例对象,如A a=new A() 工厂模式也是用来创建实例对象的,所以以后new时就要多个心眼,是否可以考虑使用工厂模式,虽然这样做,可能多做一些工作,但会给你系统带来更大的可扩展性和尽量少的修改量 —— 百度百科

    2.角色

      工厂模式有以下几个角色(结合下面流程图理解),产品即需要创建的实例对象

    • 抽象产品类:所创建产品的父类,给出一个抽象接口或抽象类,以及一般由具体产品类具体实现。(多态的表现)--- 如 Animal
    • 具体产品类:抽象产品类的实现类,为实现某个具体产品的对象。 --- 如 Dog
    • 抽象工厂类:工厂提供创建产品的方法、工厂方法模式的核心(简单工厂模式无此抽象类),与应用程序无关。是具体工厂必须实现的接口或者必须继承的父类。
    • 具体工厂类:继承抽象工厂类,实现具体业务逻辑。

    3.工厂执行的具体流程

    图解工厂模式和抽象工厂模式流程对比

    工厂模式:

    工厂模式流程

    抽象工厂模式:

    抽象工厂模式流程

    4.分类

    简单工厂模式(静态工厂方法)

    没有抽象工厂类,由工厂类自身提供产品,代码如下

    抽象产品类(抽象类或接口)

    public interface IProduct{
        void method();
    }
    

    具体产品实现类

    //A产品
    public class ProductA implement IProduct{
        void method(){
            logger.info("ProductA");
        }
    }
    
    //B产品
    public class ProductB implement IProduct{
        void method(){
            logger.info("ProductB");
        }
    }
    

    工厂类

    public class Factory{
        //简单工厂模式 只有一个静态方法提供产品所以也叫静态工厂方法
        public static IProduct createProduct(String productName){
            if("A".equals("A"){
                return new ProductA();
            }else if("B".equals("B"){
                return new ProductB();
            }else
        }
    }
    
    • 优点  强调职责单一原则,一个类只提供一种功能
    • 缺点  一旦对工厂类的修改就违反了开封闭原则

    工厂模式

    工厂模式有一个抽象工厂类对应多个个具体工厂实现类、一个抽象产品类对应一个具体实现类、并且每个具体工厂类只能创建一个具体产品类的实例

    抽象产品类(抽象类或接口)

    public interface IProduct{
        void method();
    }
    

    具体产品实现类

    //A产品
    public class ProductA implement IProduct{
        void method(){
            logger.info("ProductA");
        }
    }
    
    //B产品
    public class ProductB implement IProduct{
        void method(){
            logger.info("ProductB");
        }
    }
    

    抽象工厂类(抽象类或接口)

    public abstract class Factory{    
    /**  
    *抽象工厂方法  
    *具体产生什么由子类决定  
    *@return 具体产品对象  
    */    
    public abstract IProduct createProduct();    
    }     
    

    具体工厂类

    //A工厂
    public class AFactory extends Factory {
        //提供A产品
        public  IProduct createProduct(){
            return new ProductA();
         }
    }
    
    //B工厂
    public class BFactory extends Factory {
        //提供B产品
        public  IProduct createProduct(){
            return new ProductB();
         }
    }
    

    用法

    Factory factory = new AFactory();  
    IProduct aProduct = factory.createProduct();  
    product.method();  
    
    • 优点  克服了简单工厂违背开放-封闭原则的缺点,又保留了封装对象创建过程的优点,降低客户端和工厂的耦合性,所以说“工厂模式”是“简单工厂模式”的进一步抽象和推广
    • 缺点 每增加一个产品,相应的也要增加一个子工厂,加大了额外的开发量。

    抽象工厂模式

    工厂模式有一个抽象工厂类对应多个个具体工厂实现类、多个抽象产品类对应多个具体实现类、并且每个具体工厂类可以创建多个具体产品类的实例。

    抽象产品类(抽象类或接口)

    //饮料
    public interface IDrink{
        void method();
    }
    //食物
    public interface IFood{
        void method();
    }
    

    具体产品实现类

    //面条
    public class Noddle implement IFood{
        void method(){
            logger.info("面条");
        }
    }
    
    //米饭
    public class Rice implement IFood{
        void method(){
            logger.info("米饭");
        }
    }
    
    //可乐
    public class Cola implement IDrink{
        void method(){
            logger.info("可乐");
        }
    }
    
    //米饭
    public class Sprite implement IDrink{
        void method(){
            logger.info("雪碧");
        }
    }
    
    

    抽象工厂类(抽象类或接口)

    public abstract class Factory{    
    /**  
    *抽象工厂方法  
    *具体产生什么由子类决定  
    *@return 具体产品对象  
    */    
    public abstract IFood createFoodProduct();    
    public abstract IDrink createDrinkProduct();    
    }     
    

    具体工厂类

    //A餐工厂(提供可乐和米饭)
    public class AFactory extends Factory{
        //提供可乐
        public  IDrink createDrinkProduct(){
            return new Cola();
         }
         
         //提供米饭
        public  IFood  createFoodProduct(){
            return new Rice();
         }   
         
         
    }
    
    //B餐工厂(提供面条和雪碧)
    public class BFactory extends Factory{
        //提供面条
        public  IFood createFoodProduct(){
            return new Noddle();
         }
         
     //提供雪碧
        public  IDrink createDrinkProduct(){
            return new Sprite();
         }
     
    }
    

    用法

    Factory factory = new AFactory();  
    IDrink cola = factory.createDrinkProduct();  
    cola.method(); 
    IFood riceFood = factory.createFoodProduct(); 
    riceFood.method();  
    
    • 优点
      (1)具有工厂方法模式解耦的优点。
      (2)工厂模式针对的是一个产品等级结构,抽象工厂模式针对的是面向多个产品等级结构的。
      最主要的是可以在类内部对产品族的关联关系进行定义和描述。
    • 缺点 (1)产品族的扩展将是一件十分费力的事情,假如产品族中需要增加一个新的产品,则几乎所有的工厂类都需要进行修改。
      (2)在具体工厂类的方法中,对于产品族里的产品,只能使用其中一个。这也比较容易理解,比如,一个套餐不会包含两款饮料(一款车子不可以搭载两种空调)。

    总结

    1.有利有弊

    优点:将对象的创建统一起来便于维护和整体把控,对扩展开放,对修改封闭
    缺点:耦合性提高,由于工厂类集中了所有实例的创建逻辑,违反了高内聚责任分配原则,将全部创建逻辑集中到了一个工厂类中,这种对条件的判断和对具体产品类型的判断交错在一起,很难避免模块功能的蔓延,对系统的维护和扩展非常不利。

    2.使用有限制

    从工厂模式的示例可以看出:工厂模式需要类实现它的接口并且在业务内部存在明显的继承关系,比如汽车和奔驰宝马的关系。而继承关系往往存在于模型之间,业务之间很难存在继承关系,因此如果业务内部或者业务之间没有这种显式的继承关系该咋办?就算业务内部有继承关系,各个业务交给你统一管理,这样就会提高代码的耦合性,当创建逻辑复杂的时候,工厂方法就很复杂,容易产生干扰。

    3.其开闭性优点很容易被替代

    可以通过高度层次化和模块化来提高系统的开闭性,而不必生硬地去套用工厂模式。

    学习参考

    设计模式——工厂方法模式详解

    相关文章

      网友评论

        本文标题:Java工厂模式详解--学习笔记

        本文链接:https://www.haomeiwen.com/subject/tknruxtx.html