欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

【设计模式】工厂模式

程序员文章站 2022-06-13 14:14:16
...
(一)什么是工厂模式?
工厂模式具体包括了简单工厂、工厂方法、抽象工厂,它们是按照从简单到复杂的顺序排列的,属于设计模式中的创建型。
创建型模式将创建对象的过程进行了抽象,也可以理解为将创建对象的过程进行了封装,作为客户程序仅仅需要去使用对象,而不再关心创建对象过程中的逻辑。
其中简单工厂并不属于GOF的23种模式,但是它是理解其它的工厂模式的一个很好的基础,所以我们在讲到工厂模式的时候顺便学习它。
(二)为什么需要工厂模式?
你是否经常为重复创建对象实例而感到烦恼?你是否因为要对实例进行大量初始化工作而感到烦躁?你想不想一劳永逸解决这些烦恼?那么,就是你啦皮卡丘~~哦不,工厂模式!
(三)简单工厂模式
简单工厂模式是由一个工厂对象根据收到的消息决定要创建哪一个类的对象实例,通常这个实例有共同的父类。
比如下图的小米手机工厂(XMFactory),接受参数0生产小米8,接受1生产小米MIX:

【设计模式】工厂模式

  • 接口:Phone
public interface Phone {
    void sayName();
}
  • 实现类:Mi8Phone/MIXPhone
class Mi8Phone implements Phone {
    @Override
    public void sayName() {
        System.out.println("小米8");
    }
}

class MIXPhone implements Phone {
    @Override
    public void sayName() {
        System.out.println("小米MIX");
    }
}
  • 工厂类:XMFactory
public class XMFactory {
        public Phone createPhone(int i){
            Phone p=null;
          switch (i){
              case 0: p=new Mi8Phone();
              case 1: p=new MIXPhone();
          }
          return p;
        }
}
  • 用户:Test
public class Test {
    public static void main(String[] args) {
        XMFactory factory = new XMFactory();
        //获得小米8
       factory.createPhone(0).sayName();
       //获得小米MIX
       factory.createPhone(1).sayName();
    }
}
简单工厂模式最大的优点在于工厂类中包含了必要的逻辑,根据客户需要的逻辑动态实例化相关的类,客户只需要传入工厂类参数就能得到对应的对象,对于如何创建对象(逻辑)不关心。
它的缺点也很明显,比如我们需要小米生产另一款手机比如红米,不单单需要增加一个产品类,还需要修改工厂类中的方法,可扩展性比较差,仅仅适用于产品比较少的情况。
(四)工厂方法模式
工厂方法模式定义了一个创建对象的接口,但由子类决定要实例化的类是哪一个,工厂方法把类实例化的时机推迟到子类。
比如下图的手机厂(PhoneFactory),由手机厂的子类去决定实例化的类是哪一个:

【设计模式】工厂模式

  • 手机厂接口:PhoneFactory
public interface PhoneFactory {
  Phone createPhone();
}
  • 小米手机厂:XMFactory
public class XMPhone implements Phone {
    @Override
    public void sayName() {
        System.out.println("我是小米手机!");
    }
}
  • 华为手机厂:HWFactory
public class HWPhone  implements Phone{
    @Override
    public void sayName() {
        System.out.println("我是华为手机!");
    }
}
  • 手机接口:Phone
public interface Phone {
    void sayName();
}
  • 小米手机:XMPhone
public class XMPhone implements Phone {
    @Override
    public void sayName() {
        System.out.println("我是小米手机!");
    }
}
  • 华为手机:HWPhone
public class HWPhone  implements Phone{
    @Override
    public void sayName() {
        System.out.println("我是华为手机!");
    }
}
  • 用户:Test
public class Test {
    public static void main(String[] args) {
        PhoneFactory xmFactory = new XMFactory();//小米工厂
        PhoneFactory hwFactory = new HWFactory();//华为工厂
        //获得小米手机
        xmFactory.createPhone().sayName();
        //获得华为手机
        hwFactory.createPhone().sayName();
    }
}
工厂方法模式中让子类决定具体实例化的对象,把简单的内部逻辑判断移到了客户端,克服了简单工厂所违背的开闭原则的缺点,又保持了封装对象创建过程的优点,扩展性高,想要增加一个产品,只要扩展一个工厂类就可以。
(五)抽象工厂模式
抽象工厂模式是围绕一个超级工厂创建其他工厂,该超级工厂又称为其他工厂的工厂,该模式下可以向用户提供一个接口,使得用户在不必指定产品的具体类型的情况下,创建多个产品族中的产品对象。
(六)总结
(1)工厂模式的概括
  • 简单工厂:一个工厂类,一个产品抽象类。
  • 工厂方法:多个工厂类,一个产品抽象类。
  • 抽象工厂:多个工厂类,多个产品抽象类。
(2)生活中的工厂模式
  • 简单工厂类:一个麦当劳店,可以生产多种汉堡。
  • 工厂方法类:一个麦当劳店,可以生产多种汉堡。一个肯德基店,也可以生产多种汉堡。
  • 抽象工厂类:百胜餐饮集团下有肯德基和百事公司,肯德基生产汉堡,百事公司生成百事可乐。
相关标签: 工厂模式