YeBin`s Blog

vuePress-theme-reco YeBin    2017 - 2020
YeBin`s Blog YeBin`s Blog

Choose mode

  • dark
  • auto
  • light
首页
分类
  • java
标签
时间线
联系我
  • GitHub
author-avatar

YeBin

5

Article

2

Tag

首页
分类
  • java
标签
时间线
联系我
  • GitHub
  • 简单工厂模式

简单工厂模式

vuePress-theme-reco YeBin    2017 - 2020

简单工厂模式


YeBin 2017-12-15 tag1

# 定义:

​ 定义一个用于创建对象的接口,让子类决定实例化哪一个类。工厂方法使一个类 的实例化延迟到其子类 。也就是说把对象的创建交给工厂,不需要手动去new 出对象。

# 结构

​ 1567772422080

三要素:

  • 工厂类:定义了创建对象的行为。
  • 抽象产品类:工厂创建对象的父类,为工厂创建所有对象提供一个公共的接口
  • 具体产品类:抽象产品的子类,工厂所创建的目标

# 简单工厂的实现:

这里我以手机为例,手机有苹果手机,三星手机,华为手机,我们可已使用工厂来创建这三种手机

  1. 创建抽象产品类:

​

public abstract class Phone {
     protected  String  model;

    public Phone(String model) {
        this.model = model;
    }

    public abstract void  getInfo();
}

1
2
3
4
5
6
7
8
9
10
  1. 创建具体产品类:
//苹果手机
public class IPhone  extends  Phone{
    public IPhone(String model) {
        super(model);
    }

    @Override
    public void getInfo() {
        System.out.println("这是一部"+model+"手机");
    }
}

//华为手机
public class Huawei extends Phone {
    public Huawei(String model) {
        super(model);
    }

    @Override
    public void getInfo() {
         System.out.println("这是一部"+model+"手机");
    }
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
  1. 创建工厂类:
ublic class PhoneFactory {
     private  static Phone phone=null;

      /***
       * @Description TODO  工厂方法,生产给定model的手机
       * @param [model]
       * @return FactoryMode.SimpleFactoryMode.Phone
       * @author 98262
       */

     public static  Phone getPhone(String model)
     {
            switch (model)
            {
                case "IPhone":phone=new IPhone(model);break;

                case "Huawei":phone=new Huawei(model);break;
                //其他产品无法生产
                default:throw new IllegalArgumentException("不能生产该型号的手机 model="+model);
            }

            return  phone;
     }
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
  1. 测试:
public class test {
    public static void main(String[] args) {
          Phone iPhone=PhoneFactory.getPhone("IPhone");
          iPhone.getInfo();
          Phone huawei=PhoneFactory.getPhone("Huawei");
          huawei.getInfo();
          Phone sumsung=PhoneFactory.getPhone("SumSumg");
          sumsung.getInfo();
    }

1
2
3
4
5
6
7
8
9
10

1567774027117

# 优缺点:

​ 优点:工厂中集成了创建产品的逻辑,用于不需要直接创建产品,用户只需要给出需要的参数即可,怎么去创建对象对用户是透明的。

​ 缺点:由于工厂中集成了创建产品的逻辑,一旦出现问题,导致整个系统出现问题。另外,一旦添加新的产品,就要修改工厂的逻辑,这违反了开闭原则,当产品太多时,导致工厂类太过臃肿,维护困难。

# 适用场景:

​ 工厂类负责创建的对象很少且逻辑不是很复杂