关于设计模式的学习,中间断开也有一段时间了,现在继续补上。
刚接触这个模式的时候其实也和工厂模式搞混了,不过静下心来仔细地理理也算清楚了。
在开始讲抽象工厂模式之前,我这里先引入两个概念(刚开始绕了半天),以便更好地了解抽象工厂模式(例子我还是用之前讲工厂模式小米和苹果的例子):
产品层次结构: 产品层次结构就是产品的继承结构。比如我们有一个抽象类或者接口是手机,它的子类有苹果手机、小米手机、华为手机等具体的手机,那么抽象的手机和具体的手机这两者之间便构成了一个产品层次结构。抽象手机作为父类或者父接口,而具体品牌的手机则作为其子类。
-
产品族: 在抽象工厂模式中,产品族是指由同一个工厂生产的,位于不同产品层次结构中的一组产品。比如苹果电子工厂生产的苹果手机、苹果电脑,苹果手机位于手机产品层次结构中,苹果电脑位于电脑产品层次结构中,那么苹果手机和苹果电脑就构成了一个产品族。
抽象工厂模式:提供一个创建一系列相关或者相互依赖对象的接口,无需指定他们的具体的类,从而创建多个产品族中的产品对象。
满足条件
抽象工厂模式需要满足以下的条件:
1. 系统当中有多个产品族,而且系统一次只可能消费其中一族产品;
2 . 同属于同一个产品族的产品以供其使用;
实现方式
1.创建一个Phone接口(抽象类,普通Java类都行)
public interface Phone {
void call();
}
2.创建实现Phone接口的具体产品类IPhone、MiPhone
public class IPhone implements Phone {
public void call() {
System.out.println("IPhone call...");
}
}
public class MiPhone implements Phone {
public void call() {
System.out.println("MiPhone call...");
}
}
3.创建一个Computer接口
public interface Computer {
void play();
}
4.创建实现Computer接口的具体产品类IComputer、MiComputer
public class IComputer implements Computer {
@Override
public void play() {
System.out.println("IComputer play...");
}
}
public class MiComputer implements Computer {
@Override
public void play() {
System.out.println("MiComputer play...");
}
}
5.创建一个抽象的工厂Factory
public interface Factory {
Phone createPhone();
Computer createComputer();
}
6.创建实现Factory接口的具体工厂类IFactory、MiFactory
public class IFactory implements Factory {
@Override
public Phone createPhone() {
return new IPhone();
}
@Override
public Computer createComputer() {
return new IComputer();
}
}
public class MiFactory implements Factory {
@Override
public Phone createPhone() {
return new MiPhone();
}
@Override
public Computer createComputer() {
return new MiComputer();
}
}
7.抽象工厂测试类
public class AbstractFactoryTest {
public static void main(String[] args) {
Factory f = new IFactory();
Computer c = f.createComputer();
c.play();
}
}
这里跟我之前引入概念中所说的一样,IPhone和MiPhone属于产品层次结构,同理IComputer和MiComputer也一样。而IPhone和IComputer属于产品族。
缺点与不足
我们在使用抽象工厂模式的时候,但凡我们需要增加新的产品层次结构,我们就需要新增原有层次结构对应数量的产品类,同时还要修改对应数量的工厂类,这样大批量的修改显然是不合适的。
优化改进
针对上述的问题,利用简单工厂和反射结合的方式来改进抽象工厂:
上述步骤1.2.3.4保持不变。我们从上述步骤5.创建一个抽象的工厂Factory开始做修改。
public class Factory {
public static Phone createPhone(Class clazz) throws Exception {
return (Phone) clazz.newInstance();
}
public static Computer createComputer(Class clazz) throws Exception {
return (Computer) clazz.newInstance();
}
}
之前的步骤6我们也不需要了,直接写个抽象工厂测试类测试下:
public class AbstractFactoryTest {
public static void main(String[] args) throws Exception {
Computer c = Factory.createComputer(MiComputer.class);
c.play();
}
}
输出:
MiComputer play...