工厂方法模式


工厂方法模式

1.基础知识

定义∶

定义一个创建对象的接口

但让实现这个接口的类来决定实例化哪个类工厂方法让类的实例化推迟到子类中进行

通过不同的子类来实现不同的功能,但是这些功能都是同类的。

元素:

1.抽象工厂(返回抽象产品对象也就是返回抽象的父类:来迎接不同功能的子类)

2.具体功能产品的工厂(返回抽象产品对象也就是返回抽象的父类:来迎接不同功能的子类)

3.抽象产品

4.具体功能产品

适用场景

创建对象需要大量重复的代码

客户端(应用层)不依赖于产品类实例如何被创建、实现等细节

一个类通过其子类来指定创建哪个对象

优点

用户只需要关心所需产品对应的工厂,无须关心创建细节

加入新产品符合开闭原则,提高可扩展性

缺点

类的个数容易过多,增加复杂度

增加了系统的抽象性和理解难度


2.实战

这里以常见的安卓手机和苹果手机为例;

UML如图:

image-20220117212655186

/**
 * @Author LYS
 * @Date 2022/1/17 21:21
 * @Version 1.0
 */
public class AndroidPhone extends Phone {
    @Override
    public void produce() {
        System.out.println("生产安卓手机");
    }
}
/**
 * 安卓手机工厂
 * @Author LYS
 * @Date 2022/1/17 21:20
 * @Version 1.0
 */
public class AndroidPhoneFactory extends PhoneFactory{
    @Override
    public Phone getPhone() {
        return new AndroidPhone();
    }
}
/**
 * @Author LYS
 * @Date 2022/1/17 21:22
 * @Version 1.0
 */
public class ApplePhone extends Phone{
    @Override
    public void produce() {
        System.out.println("生产苹果手机");
    }
}
/**
 * @Author LYS
 * @Date 2022/1/17 21:22
 * @Version 1.0
 */
public class ApplePhoneFactory extends PhoneFactory{
    @Override
    public Phone getPhone() {
        return new ApplePhone();
    }
}
/**
 * @Author LYS
 * @Date 2022/1/17 21:19
 * @Version 1.0
 */
public abstract class Phone {
    public abstract void produce();
}
/**
 * 手机工厂
 * @Author LYS
 * @Date 2022/1/17 21:19
 * @Version 1.0
 */
public abstract class PhoneFactory {
    public abstract Phone getPhone();
}
/**
 * @Author LYS
 * @Date 2022/1/17 21:23
 * @Version 1.0
 */
public class Test {
    public static void main(String[] args) {
        ApplePhoneFactory applePhoneFactory = new ApplePhoneFactory();
        AndroidPhoneFactory androidPhoneFactory = new AndroidPhoneFactory();
        Phone applePhone = applePhoneFactory.getPhone();
        applePhone.produce();
        Phone androidPhone = androidPhoneFactory.getPhone();
        androidPhone.produce();
    }
}

控制台输出:

image-20220117212743409

如果后续有新的手机类型来了,比如华为手机,那么只需要创建华为手机工厂 HUAWEIPhoneFactory继承PhoneFactory重写getphone方法即可,对于同一类产品等级都可以用工厂方法模式解决


3.源码

ArrayList里的代码

public Iterator iterator() {
    return new Itr();
}

/**
 * An optimized version of AbstractList.Itr
 */
private class Itr implements Iterator {
    int cursor;       // index of next element to return
    int lastRet = -1; // index of last element returned; -1 if no such
    int expectedModCount = modCount;

    public boolean hasNext() {
        return cursor != size;
    }

iterator() 方法是实现了List类接口,List类就是一个抽象工厂,arrylist就是一个具体的工厂,生产具体的类

Itr 就是具体的实现的产品对应实战里的安卓手机类或者苹果手机类,Iterator是抽象的产品对应实战里的抽象手机类

相关