在总结抽象工厂前需要理解产品族以及产品等级结构的概念
产品等级结构:等级结构即产品的继承结构
产品族:同一个工厂生产的位于不同产品等级结构中一系列产品
如图
1.纵向的为产品等级结构,可以看出纵向为继承结构,电视,冰箱,电风扇都有具体的子类
2.横向为产品族,可以看出电视,冰箱,电风扇都有具体的品牌即都是有某个具体的工厂生产,也即是说它们有同一个工厂生产的一系列产品
1.定义:提供了创建一系列相关产品族的接口而无需明确指定它们的类型
2.UML
3.理论基础:里氏替换原则,继承,多态
4.涉及角色:
抽象产品:某类产品的抽象,主要定义了产品具有的属性和行为
抽象产品工厂:该模式的核心,定义了创建产品族中各个抽象产品的具体方法,返回值为抽象产品,需要具体产品工厂实现
具体产品:抽象产品的子类
具体产品工厂:抽象工厂的子类,在该工厂中可以常见一系列具体的产品
5.优点
1.封装性该模式向客户端提供了一个接口,使用者在不必指定具体产品的情况下可以创建某个产品族中的产品对象,前提是需要知道具体的工厂
2.便于交换产品系类,e.g.:IProduceFactory factory = new TCLFactory();--->IProduceFactory factory = new HaierFactory();具体工厂只有在初始化的时候会出现,这使得改变一个具体工厂变得非常容易
3.具体创建实例的过程与客户端分离,客户端通过抽象接口操作实例,产品的具体类名也被具体的工厂分离,不会出现在客户端
4.对于某一个具体的产品族,都有某个具体的工厂创建
5.遵循依赖倒转原则,客户端依赖的是抽象产品
6.缺点
1. 存在多个产品等级结构时,会导致多个平行的工厂等级结构,产品的等级结构和工厂的等级结构成正比。抽象产品存在n个具体产品时,我们需要提供n个具体工厂来获得n个具体产品,随着具体产品的增多,导致系统中存在大量的平行工厂
2.产品族的扩展很困难,当系统中需要加入具体产品时,需要修改抽象工厂以及具体工厂
7.使用场景
1.系统中存在多个抽象产品角色时,即系统中存在具体的产品等级结构以及产品族
8.Code
//抽象产品
package com.patterns.build.abstracted.produce;
public interface Fan {
public String getProduceType();
}
package com.patterns.build.abstracted.produce;
public interface TV {
public String getProduceName();
}
存在多个抽象产品有可能构成产品族
抽象工厂
package com.patterns.build.abstracted.factory;
import com.patterns.build.abstracted.produce.Fan;
import com.patterns.build.abstracted.produce.TV;
public interface IProduceFactory {
public TV createTV();
public Fan createFan();
}
具体产品
package com.patterns.build.abstracted.concrete.produce;
import com.patterns.build.abstracted.produce.Fan;
public class HaierFan implements Fan{
@Override
public String getProduceType() {
//TODO business logic
return "Haier-Fan";
}
}
package com.patterns.build.abstracted.concrete.produce;
import com.patterns.build.abstracted.produce.TV;
public class HaierTV implements TV{
@Override
public String getProduceName() {
//TODO business logic
return this.getClass().getSimpleName();
}
}
package com.patterns.build.abstracted.concrete.produce;
import com.patterns.build.abstracted.produce.Fan;
public class TCLFan implements Fan{
@Override
public String getProduceType() {
//TODO business logic
return "TCL-Fan";
}
}
package com.patterns.build.abstracted.concrete.produce;
import com.patterns.build.abstracted.produce.TV;
public class TCLTV implements TV{
@Override
public String getProduceName() {
//TODO business logic
return this.getClass().getSimpleName();
}
}
//具体工厂
package com.patterns.build.abstracted.concrete.factory;
import com.patterns.build.abstracted.concrete.produce.HaierFan;
import com.patterns.build.abstracted.concrete.produce.HaierTV;
import com.patterns.build.abstracted.factory.IProduceFactory;
import com.patterns.build.abstracted.produce.Fan;
import com.patterns.build.abstracted.produce.TV;
public class HaierFactory implements IProduceFactory{
@Override
public TV createTV() {
return new HaierTV();
}
@Override
public Fan createFan() {
return new HaierFan();
}
}
package com.patterns.build.abstracted.concrete.factory;
import com.patterns.build.abstracted.concrete.produce.TCLFan;
import com.patterns.build.abstracted.concrete.produce.TCLTV;
import com.patterns.build.abstracted.factory.IProduceFactory;
import com.patterns.build.abstracted.produce.Fan;
import com.patterns.build.abstracted.produce.TV;
public class TCLFactory implements IProduceFactory{
@Override
public TV createTV() {
return new TCLTV();
}
@Override
public Fan createFan() {
return new TCLFan();
}
}
客户端
package com.patterns.build.abstracted;
import com.patterns.build.abstracted.concrete.factory.HaierFactory;
import com.patterns.build.abstracted.concrete.factory.TCLFactory;
import com.patterns.build.abstracted.factory.IProduceFactory;
public class Client {
public static void main(String[] args){
//具体产品通过具体工厂有效隔离,客户端不需要关心具体细节,只需要通过具体工厂获得实例即可
IProduceFactory factory = new TCLFactory();
//只要保持抽象不变,那么客户端不需要作出任调整
System.out.println(factory.createFan().getProduceType());
System.out.println(factory.createTV().getProduceName());
//当产品族发生变化时,只需要替换具体的产品工厂即可
factory = new HaierFactory();
System.out.println(factory.createTV().getProduceName());
System.out.println(factory.createFan().getProduceType());
}
}