一、抽象工厂模式
抽象工厂模式结构如下:
抽象工厂:提供了创建产品的接口,它包含多个创建产品的方法,可以
创建多个不同等级的产品。
具体工厂:主要是实现抽象工厂中的多个抽象方法,完成具体产品的创
建。
抽象产品:定义了产品的规范,描述了产品的主要特性和功能,抽象工厂模式有多
个抽象产品。
具体产品:实现了抽象产品角色所定义的接口,由具体工厂来创建,它同具体工厂之间是多对一的关系。
二、上代码
1、创建抽象工厂也就是工厂接口,工厂里面抽象的产品方法
public interface CoffeeFactory {
Coffee createCoffee();
}
2、抽象产品类
public abstract class Coffee {
public abstract String getName();
}
3、具体产品类
public class LatteCoffee extends Coffee {
public String getName() {
return "拿铁咖啡";
}
}
4、具体工厂类,专门用来生产某一类产品
public class LatteCoffeeFactory implements CoffeeFactory {
public Coffee createCoffee() {
return new LatteCoffee();
}
}
5、获取对象
public class Client {
public static void main(String[] args) {
CoffeeFactory factory = new LatteCoffeeFactory()
System.out.println(coffee.getName());
}
}
三、具体案例:jdk中Collection.iterator方法
1、抽象工厂
//Collectiony也就是上面所提的抽象工厂类
public interface Collection<E> extends Iterable<E> {
//Iterator 也就是抽象产品类
Iterator<E> iterator();
}
2、抽象产品类
public interface Iterator<E> {}
3、具体工厂类
ArrayList实现了List 而List实现了Collection接口,也就是抽象工厂类
public class ArrayList<E> extends AbstractList<E>
implements List<E>, RandomAccess, Cloneable, java.io.Serializable
{
public Iterator<E> iterator() {
return new Itr();
}
}
4、具体产品类
private class Itr implements Iterator<E> {
int cursor; // index of next element to return
int lastRet = -1; // index of last element returned; -1 if no such
int expectedModCount = modCount;
Itr() {}
public boolean hasNext() {
return cursor != size;
}
@SuppressWarnings("unchecked")
public E next() {
checkForComodification();
int i = cursor;
if (i >= size)
throw new NoSuchElementException();
Object[] elementData = ArrayList.this.elementData;
if (i >= elementData.length)
throw new ConcurrentModificationException();
cursor = i + 1;
return (E) elementData[lastRet = i];
}}
5、获取对象
public class A {
public static void main(String[] args) {
List<String> list = new ArrayList<>();
list.add("1");
list.add("2");
//获取Itr对象
Iterator<String> iterator = list.iterator();
while (iterator.hasNext()){
String next = iterator.next();
System.out.println(next);
}
}
}