zoukankan      html  css  js  c++  java
  • 设计模式三:工厂方法模式

    疑惑解答:
    1.interface接口不能够实例化(new),但是可以定义引用来指向继承该接口的实体类;
    如:
    interface animal{
         void eat();
    }
     
    class Cat implements animal{
         public void eat(){
              System.out.println("The cat eat!");
         }
    }
     
    animal an = new Cat();

    一.什么是工厂方法模式
         1.是简单工厂模式的进一步抽象;
         2.定义一个创建产品对象的工厂接口,将实际创建工作推迟到子类当中。
         3.核心工厂类不再负责产品的创建,是一个抽象工厂角色,仅负责声明工厂子类必须实现的方法。
         4.而所有的工厂之类都必须实现这个抽象工厂,并且每种产品都有一一对应的工厂子类负责产品的创建(实例化);
    二.工厂方法模式的角色
    产品:
         1.产品父类或者接口: 具体产品的共同父类或接口。
         2.具体产品类:具体的产品;工厂进行实例化的目标;
    工厂:
         1.抽象工厂(接口): 是工厂方法模式的核心。任何工厂子类都必须实现这个接口;
         2.具体产品工厂:与具体的产品一一对应,负责创建具体产品的实例。
    三.类图
        
    四.深入分析
         1.工厂方法模式相对于简单工厂模式而言,最大的特点是:将选择判断创建实例的权利交给了客户端。而不是一个统一的工厂。因此其在实现上克服了简单工厂违反“开方--封闭”的缺陷,实现了可扩展。
         2. 工厂方法模式对简单工厂模式进行了抽象。有一个抽象的Factory类(可以是抽象类和接口),这个类将不再负责具体的产品生产,而是只制定一些规范,具 体的生产工作由其子类去完成。在这个模式中,工厂类和产品类往往可以依次对应。即一个抽象工厂对应一个抽象产品,一个具体工厂对应一个具体产品,这个具体 的工厂就负责生产对应的产品。
        3.应用场景:
              a. 对于某个产品,调用者清楚地知道应该使用哪个具体工厂服务,实例化该具体工厂,生产出具体的产品来。
              b. 只是需要一种产品,而不想知道也不需要知道究竟是哪个工厂为生产的,即最终选用哪个具体工厂的决定权在生产者一方,它们根据当前系统的情况来实例化一个具体的工厂返回给使用者,而这个决策过程这对于使用者来说是透明的。
     
    五.代码
     
    class Product{
         int num;      
         int price;
    }
     
    // 具体产品
    class ProductA extends Product{
         public void setNum(int num){
              num = num;
         }
         public void setName(String name){
              name = name;
         }
    }
     
    class ProductB extends Product{
         public void setNum(int num){
              num = num;
         }
         public void setName(String name){
              name = name;
         }
    }   
     
    //抽象工厂类
    interface Factory{
         Product creatProduct();
    }
     
    class ProductAFactory implemnets Factory{
         public Product creatProduct(){
             return  new ProductA();
         }
    }
     
    class ProductBFactory implements Factory{
         public Product creatProduct(){
         return new ProductB();
         }
    }
    ----------------------------------------
    客户端代码:
    Factory factory = new ProductAFactory();
    Product product = factory.creatProduct();  //生产出具体的产品
  • 相关阅读:
    java8特性 Optional 工具类
    SpringBoot 配置支付宝接口
    Redis宕机 快速恢复
    flowable流程引擎通过模型ID部署流程
    java OA系统 自定义表单 流程审批 电子印章 手写文字识别 电子签名 即时通讯
    Mybatis 动态执行SQL语句
    idea 访问 jsp 404问题
    变量名的命名
    CSS设计 Search窗口
    jQuery实现Ajax功能示例
  • 原文地址:https://www.cnblogs.com/beijixingzhiguang/p/4321043.html
Copyright © 2011-2022 走看看