zoukankan      html  css  js  c++  java
  • 工厂设计模式

    一.为什么要使用工厂设计模式

    1.使用工厂设计模式主要目的是为了解耦,即对象的创建和对象的使用分开来进行,如classA需要使用classB的对象,自己不需要new一个classB的对象,交给工厂即可,符合“单一职责原则”,有利于对功能的复用和系统的维护。

    2.防止用来创建和实例化一个类的数据和代码在许多类中都存在,可以将创建该类的代码封装到一个工厂类中去,减少代码冗余,有益于系统优化和维护。

    3.工厂管理了类的创建逻辑,使用者不需要知道类的创建逻辑如何,只需要使用即可,减少出错的概率。

    二.厂模式的三种类型

    1.简单工厂类

    package com.yqg.day2;
    
    public class Factory {
          int num;
          public Factory(int num) {
              this.num=num;
          }
          public Product getProduct() {
              switch(num) {
              case 1:
                  return new Product1();
                  
              case 2:
                 return new Product2();
                 
              default:
                  return null;
              }
          }
    }
    
    interface Product{
        void said();
    }
    
    class Product1 implements Product{
    
        @Override
        public void said() {
            System.out.println("产品1");
            
        }
        
    }
    
    class Product2 implements Product{
    
        @Override
        public void said() {
            System.out.println("产品2");
            
        }
        
    }

    缺点:如果产品类非常多,会给产品维护和扩展带来很多麻烦。而且有新的产品加入就要修改工厂类的代码,违反了开闭原则,扩展开始,修改关闭。

    2.工厂模式

    interface IFactory //工厂接口
        {
            IProduct GetProduct();
        }
     
        //A工厂类
        public class FactoryA: IFactory
        {
            IProduct productA;
            public FactoryA()
            {
                this.productA = new ProductA();
            }
     
            public IProduct GetProduct() //A工厂生产A产品
            {
                return this.productA;
            }
        }
     
        //B工厂类
        public class FactoryB : IFactory
        {
            IProduct productB;
            public FactoryB()
            {
                this.productB = new ProductB();
            }
     
            public IProduct GetProduct() //B工厂生产B产品
            {
                return this.productB;
            }
        }
     
        //产品接口
        public interface IProduct
        {
            //产品方法
            //......
        }
     
        //产品A
        public class ProductA : IProduct
        {
            //产品属性
            //......
        }
     
        //产品B
        public class ProductB : IProduct
        {
            //产品属性
            //......
        }

    观察代码,现在一个工厂负责生产一个产品,如果新增产品C,只需要增加一个工厂C生产产品C,不会对其他产品造成影响,但是工厂模式无法满足产品族和产品等级结构的问题。所以我们用到了下面的抽象工厂。

    3.抽象工厂

      //工厂接口,即抽象工厂
            interface IFactory
            {
                IFridge CreateFridge();
                IAirCondition CreateAirCondition();
            }
     
     
            //三星的工厂,生产三星的产品族
            public class SamsungFactory : IFactory
            {
      
                public IAirCondition CreateAirCondition() 
                {
                    return new SamsungAirCondition(); //三星的工厂生产三星的空调
                  
                }
     
                public IFridge CreateFridge()
                {
                    return new SamsungFridge(); //三星的工厂生产三星的冰箱
                }
            }
     
            //格力的工厂,生产格力的产品族
     
            public class GreeFactry : IFactory
            {
                public IAirCondition CreateAirCondition()
                {
                    return new GreeAirCondition(); //格力的工厂生产格力的空调
                }
     
                public IFridge CreateFridge()
                {
                    return new GreeFridge(); //格力的工厂生产格力的冰箱
                }
            }
     
            //冰箱产品接口
            public interface IFridge
            {
                //冰箱产品接口
                //冰箱的action
            }
     
            //空调接口
            public interface IAirCondition
            {
                //空调产品接口
                //空调的action
            }
     
            //三星的冰箱
            public class SamsungFridge: IFridge
            {
               //三星冰箱的action和property
            }
            //格力的冰箱
            public class GreeFridge : IFridge
            {
                 //格力冰箱的action和property
            }
     
            //三星的空调
            public class SamsungAirCondition : IAirCondition
            {
               //三星空调的action和property
            }
            //格力的空调
            public class GreeAirCondition : IAirCondition
            {
                //格力空调的action和property
            }

    4.总结

    一、三种工厂的实现是越来越复杂的

    二、简单工厂通过构造时传入的标识来生产产品,不同产品都在同一个工厂中生产,这种判断会随着产品的增加而增加,给扩展和维护带来麻烦

    三、工厂模式无法解决产品族和产品等级结构的问题

    四、抽象工厂模式中,一个工厂生产多个产品,它们是一个产品族,不同的产品族的产品派生于不同的抽象产品(或产品接口)。

  • 相关阅读:
    ExtJS小技巧
    Oracle 表的行数、表占用空间大小,列的非空行数、列占用空间大小 查询
    NPM 私服
    IDEA 不编译java以外的文件
    SQL 引号中的问号在PrepareStatement 中不被看作是占位符
    Chrome 浏览器自动填表呈现淡黄色解决
    批量删除Maven 仓库未下载成功.lastupdate 的文件
    Oracle 11g 监听很慢,由于监听日志文件太大引起的问题(Windows 下)
    Hibernate 自动更新表出错 建表或添加列,提示标识符无效
    Hibernate 自动更新表出错 More than one table found in namespace
  • 原文地址:https://www.cnblogs.com/zzuli/p/9311074.html
Copyright © 2011-2022 走看看