前面已经说过了简单工厂模式和普通工厂模式:链接
前沿:
参考图书:《软件设计模式与体系结构》
抽象工厂就是普通工厂模式的加强版本
优点:当一个产品族中的多个对象被设计成一起工作时,它能保证客户端始终只使用同一个产品族中的对象。
使用场景: 1、QQ 换皮肤,一整套一起换。 2、生成不同操作系统的程序。
前提:一个总的衣柜,总衣柜里面又分为7个衣柜(分别对应星期一到星期日)一天一套一套,一套衣服又由上衣和下衣组成!
那么如何保证用户调用每一个一套衣服就是当天的上衣和当天的下衣呢!所以这里就分为三个普通工厂:
根据衣柜中的具体某一天工厂加载相应的某一天的具体上衣工厂和具体下衣工厂即可!
扫描二维码关注公众号,回复:
4191708 查看本文章
最后用户直接从相应天数的衣柜中拿出衣服使用即可(此时的上衣和下衣都是当天的!!)
上衣分为 |
CoatFactory:上衣总工厂 OneCoatFactory:第一天的上衣工厂 TwoCoatFactory:第二天的上衣工厂 |
|
下衣分为 |
UnderCoatFactory:下衣总工厂 OneUnderCoatFactory:第一天的上衣工厂 TwoUnderCoatFactory:第二天的上衣工厂 |
|
衣柜分为 |
WardrobeFactory:衣柜总工厂 OneWardrobeFactory:第一天的衣服衣柜工厂 TwoWardrobeFactory:第二天的衣服衣柜工厂 |
上衣:
package cn.gxm.abstractfactory;
/**
* 上衣工厂
* @author xiaomi
*
*/
public interface CoatFactory {
//生产上衣
public void CreateCoat();
}
class OneCoatFactory implements CoatFactory{
@Override
public void CreateCoat() {
System.out.println("我是第一天的上衣");
}
}
class TwoCoatFactory implements CoatFactory{
@Override
public void CreateCoat() {
System.out.println("我是第二天的上衣");
}
}
下衣:
package cn.gxm.abstractfactory;
/**
* 下衣工厂
* @author xiaomi
*
*/
public interface UnderCoatFactory {
//生产下衣
public void CreateUndercoat();
}
class OneUnderCoatFactory implements UnderCoatFactory{
@Override
public void CreateUndercoat() {
System.out.println("我是第一天的下衣");
}
}
class TwoUnderCoatFactory implements UnderCoatFactory{
@Override
public void CreateUndercoat() {
System.out.println("我是第二天的下衣");
}
}
衣柜:
package cn.gxm.abstractfactory;
/**
* 总的衣柜工厂
* @author xiaomi
*
*/
public interface WardrobeFactory {
public void CreateClothes();
}
// 星期一穿的一套衣服在衣柜一中
class OneWardrobeFactory implements WardrobeFactory{
//第一天衣服(需要第一天的上衣和第一天的下衣)
@Override
public void CreateClothes() {
OneCoatFactory oneCoat = new OneCoatFactory ();
OneUnderCoatFactory oneUnderCoat = new OneUnderCoatFactory ();
oneCoat.CreateCoat();
oneUnderCoat.CreateUndercoat();
}
}
// 星期二穿的一套衣服在衣柜二中
class TwoWardrobeFactory implements WardrobeFactory{
//第二天衣服(需要第二天的上衣和第二天的下衣)
@Override
public void CreateClothes() {
TwoCoatFactory twoCoat = new TwoCoatFactory ();
TwoUnderCoatFactory twoUnderCoat = new TwoUnderCoatFactory ();
twoCoat.CreateCoat();
twoUnderCoat.CreateUndercoat();
}
}
用户(测试类)
package cn.gxm.abstractfactory;
public class User {
public static void main(String[] args) {
OneWardrobeFactory oneFactory = new OneWardrobeFactory();
oneFactory.CreateClothes();
System.out.println("---------------");
TwoWardrobeFactory twoFactory = new TwoWardrobeFactory();
twoFactory.CreateClothes();
}
}
结果:
我是第一天的上衣
我是第一天的下衣
---------------
我是第二天的上衣
我是第二天的下衣
抽象工厂模式中包含:
(1)一系列互相有关联的产品类,这些产品类具有相同的结构!
(2)一系列实的工厂类,实现由工提供的接口。每一个实的工厂类产生一组相关的产品类的对象!