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.总结

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

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

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

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

  • 相关阅读:
    OpenCV-Python 霍夫直线检测-HoughLinesP函数参数
    2017 年度读书总结
    检查服务是否正在运行,如果未运行则启动
    添加MIME类型
    IIS功能查看、配置
    IIS下的身份验证方式管理
    PowerShell管理IIS(新建站点、应用程序池、应用程序、虚拟目录等)
    虚拟目录和应用程序的区别
    远程重启服务器
    逐行读取txt
  • 原文地址:https://www.cnblogs.com/zzuli/p/9311074.html
Copyright © 2011-2022 走看看