引言
上一回怎么说了工厂方法模式,这回咱们来讲一讲工厂模式的另外一种表现,今天的主角"抽象工厂模式"。
示例地址
先上类图
image看看定义
为创建一组相关或者相互依赖的对象提供一个接口,而不需要指定它们的具体类。
使用场景
一个对象族有相同的约束时可以使用抽象工厂模式。
抽象工厂中的2个概念
产品族
位于不同产品等级结构中,功能相关联的产品组成的家族。代表的是纵向结构。
举个例子,华为有华为笔记本,华为手机,华为手环等,小米也有小米手机,小米笔记本,小米手环。华为这个系列的构成了家族。称为产品族。
产品等级
产品等级结构即产品的继承结构。代表的是横向结构。
举个列子,一个抽象类手机,下面可以生成小米手机、华为手机。
产品族与产品等级图
image产品类
1. 手机
/**
* 手机
*
* @author 512573717@qq.com
* @created 2018/7/9 上午10:19.
*/
public interface IPhone {
void phone();
}
/**
* 小米手机
*
* @author 512573717@qq.com
* @created 2018/7/9 上午10:25.
*/
public class XiaomiPhone implements IPhone {
@Override
public void phone() {
System.out.println("小米手机");
}
}
/**
* 华为手机
*
* @author 512573717@qq.com
* @created 2018/7/9 上午10:23.
*/
public class HuaweiPhone implements IPhone {
@Override
public void phone() {
System.out.println("华为手机");
}
}
2. 笔记本
/**
* 笔记本
*
* @author 512573717@qq.com
* @created 2018/7/9 上午10:27.
*/
public interface IComputer {
void computer();
}
/**
* 小米笔记本
*
* @author 512573717@qq.com
* @created 2018/7/9 上午10:44.
*/
public class XiaomiComputer implements IComputer {
@Override
public void computer() {
System.out.println("小米笔记本");
}
}
/**
* 华为笔记本
*
* @author 512573717@qq.com
* @created 2018/7/9 上午10:37.
*/
public class HuaweiComputer implements IComputer {
@Override
public void computer() {
System.out.println(" 华为笔记本");
}
}
3. 手环
/**
* 手环
*
* @author 512573717@qq.com
* @created 2018/7/9 上午10:55.
*/
public interface IBracelet {
void bracelet();
}
/**
* 小米手环
*
* @author 512573717@qq.com
* @created 2018/7/9 上午10:59.
*/
public class XiaomiBracelet implements IBracelet {
@Override
public void bracelet() {
System.out.println("小米手环");
}
}
/**
* 华为手环
*
* @author 512573717@qq.com
* @created 2018/7/9 上午10:57.
*/
public class HuaweiBracelet implements IBracelet {
@Override
public void bracelet() {
System.out.println("华为手环");
}
}
4. 工厂类
/**
* 抽象工厂
* @author 512573717@qq.com
* @created 2018/7/9 上午10:16.
*/
public abstract class ProductFactory {
// 创建手机
public abstract IPhone createPhone();
// 创建笔记本
public abstract IComputer createComputer();
// 创建手环
public abstract IBracelet createBracelet();
}
/**
* 小米
*
* @author 512573717@qq.com
* @created 2018/7/9 上午11:09.
*/
public class Xiaomi extends ProductFactory {
@Override
public IPhone createPhone() {
return new XiaomiPhone();
}
@Override
public IComputer createComputer() {
return new XiaomiComputer();
}
@Override
public IBracelet createBracelet() {
return new XiaomiBracelet();
}
}
/**
* 华为
*
* @author 512573717@qq.com
* @created 2018/7/9 上午11:03.
*/
public class Huawei extends ProductFactory {
@Override
public IPhone createPhone() {
return new HuaweiPhone();
}
@Override
public IComputer createComputer() {
return new HuaweiComputer();
}
@Override
public IBracelet createBracelet() {
return new HuaweiBracelet();
}
}
5. Client测试
//华为系列
System.out.println("华为");
ProductFactory huawei = new Huawei();
huawei.createPhone().phone();
huawei.createComputer().computer();
huawei.createBracelet().bracelet();
//小米系列
System.out.println("小米");
ProductFactory xiaomi=new Xiaomi();
xiaomi.createPhone().phone();
xiaomi.createComputer().computer();
xiaomi.createBracelet().bracelet();
总结
抽象工厂模式是某一系列的产品的工厂。可以创建多个不同类型的产品。例如上面所说的 华为是一个产品工厂,能够创建手机 、笔记本、手机等多个类型的产品。
抽象工厂 与工厂方法的区别
工厂方法模式针对的是一个产品等级结构;而抽象工厂模式则需要面对多个产品等级结构。
网友评论