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

      工厂,顾名思义是生产很多产品的地方,而且会有不同种类的产品,例如手机工厂,可能会生产小米手机、华为手机、诺基亚手机等等,这些不同品牌的手机可能会有自己单独的生产车间,这样一个手机工厂就相当于被分成了小米手机车间,生产小米手机、华为手机车间,生产华为手机、诺基亚手机车间,生产诺基亚手机。这样的引入大家应该比较明了的知道了工厂是什么。

    工厂模式

    1. 简单工厂:其实它不是一个设计模式,而是一种编程习惯,但是很多开发人员会把这个编程习惯当做“工厂模式”。
    2. 工厂方法模式
    3. 抽象工厂模式

    1、简单工厂

      建立一个工厂,来制造对象,此时工厂只是将客户创建对象的方法收集起来,对象是由客户自己创建的,当客户需要对象时,就到工厂中创建,然后拿来使用即可。就像手机品牌商都会制造手机,当他们销售出手机时,直接到工厂中自己制造出手机,然后拿走去销售。

    public class PhoneFactory{
      public static Phone createPhone(String type){
        Phone phone = null;
        if(type.equals("小米")){
          phone = new XiaomiPhone();    
        }else if(type.equals("华为")){
            phone = new HuaweiPhone();
        }else if(type.equals("诺基亚")){
            phone = new NuojiyaPhone();
        }
        return phone;
     }  
    }    
    
    public class PhoneStore{
       public Phone orderPhone(String type){
          Phone phone;
          phone = PhoneFactory.createPhone(type);
          phone.box();
          return phone;
        } 
    //这里是其他方法
    }    
    
                

    2、工厂方法模式

      创建了一个对象接口,但由其子类决定要实例化的类是哪一个。工厂方法让类把实例化推迟到子类。

      手机工厂就可以看做一个工厂方法模式,工厂是暴露给外界的对象接口,各个品牌手机生产车间都继承与工厂,都是工厂的子类,他们负责生产具体哪个品牌的手机,而工厂不负责生产手机,只负责为各个生产车间提供房屋,仪器,工人(这些都类似与抽象类中的抽象方法),工厂并不关心各个车间怎么使用这些资源,具体怎么使用,由他们自己决定(继承了抽象类的类,要实现抽象类中的抽象方法,即给出具体的实现细节)。生产车间制造出手机,就是实现了类的实例化。

      

    //工厂类
    public abstract class PhoneFactory{
      public Phone orderPhone(String type){
        Phone phone;
        phone = createPhone(type);
        phone.box();
        return phone;
      }
    
      protected abstract Phone createPhone(String type);
    
    }
    
    public class XiaomiPhoneFactory extends PhoneFactory{
      Phone createPhone(String item){
        if(item.equals("全面屏")){
          return new XiaomiFullPhone();
        }else if(item.equals("音乐")){
          return new XiaomiMusicPhone();
        }else return null;
      }
    }
    //华为、诺基亚手机生产车间类似
    
    
    //产品类
    public abstract class Phone{
      String name;
      String color;
      int price;
      void box(){
        System.out.println("将手机打包");
      }
      public String getName(){
        return name;
      }
    }
    
    public class XiaomiFullPhone extends Phone{
      public XiaomiFullPhone(){
        name = "小米全面屏手机";
        color = "红色";
        price = 1000;
      }
    }
    
    public class XiaomiMusicPhone extends Phone{
      public XiaomiFullPhone(){
        name = "小米拍照手机";
        color = "红色";
        price = 1200;
      }
    }
    
    //订购小米全面屏手机
    public class PhoneTest{
      public static void main(String[] args){
        PhoneFactory xiaomiPhoneFactory = new XiaomiPhoneFactory();
        Phone phone =  xiaomiPhoneFactory.order("全面屏");
        System.out.println("已经订购了一个"+phone.getName());
      }
    }

    简单工厂与工厂方法之间的差异:

        简单工厂把全部的事情都在一个地方处理完毕了,而工厂方法是创建一个框架,让子类决定如何实现。简单工厂不具备工厂方法的弹性,简单工厂不能变更正在创建的产品。

    工厂的好处:

      将创建对象的代码集中在一个对象或方法中,可以避免代码中的重复,并且更方便以后的维护。这也意味着客户在实例化对象时,只会依赖接口,而不是具体的类。

    3、抽象工厂模式

      提供一个接口,用于创建相关或依赖对象的家族,而不需要明确指定具体类。通过抽象工厂所提供的接口,可以创建产品家族,利用这个接口书写代码,我们的代码将从实际代码中解耦,以便在不同上下文中实现各式各样的工厂,制造出各种不同的产品。因为代码从实际的产品中解耦了,所以我们可以替换不同的工厂来取得不同的行为。

          手机工厂中各个品牌生产车间都会制造不同颜色的手机,为了防止从一个手机工厂中制造出的手机,会因为品牌的不同,颜色显示不同,工厂统一提供颜料。

    工厂方法与抽象工厂的区别:

    1、工厂方法用的是继承,抽象工厂用的是组合

    2、工厂方法是用来创建对象的,整个工厂方法模式,只不过就是通过子类来创建对象。用这种做法,客户只需要知道他们所使用的抽象类型就可以了,而由子类来负责决定具体类型。换句话说就是,工厂方法负责将客户从具体类型中解耦。

         抽象工厂是用来创建一个产品家族的抽象类型,这个类型的子类定义了产品被产生的方法。要想使用这个工厂,必须先实例话它,然后将它传入一些针对抽象类型所写的代码中。

  • 相关阅读:
    SHELL变量
    LA 2797
    计算几何-圆 模板 训练指南267
    hdu 2553 八皇后问题 基础
    CodeForces 557C Arthur and Table STL的使用
    LA 3263 好看的一笔画 欧拉几何+计算几何模板
    UVA 11178 Morley's Theorem 计算几何模板
    poj 1113
    poj 2187 Beauty Contest 凸包模板+求最远点对
    hdu 1081 dp问题:最大子矩阵和
  • 原文地址:https://www.cnblogs.com/xiaoxli/p/9541855.html
Copyright © 2011-2022 走看看