对于许久不用的东西,容易忘记。百度许久,也未能找到自己所要。 从今日起,有些东西就记载下来,不仅方便自己,希望能帮到他人吧!
定义:
为创建一组相关或相互依赖的对象提供一个接口,而且无需指定他们的具体类。
抽象工厂模式是所有形态的工厂模式中最为抽象和最具一般性的一种形态。抽象工厂模式是指当有多个抽象角色时,使用的一种工厂模式。抽象工厂模式可以向客户端提供一个接口,使客户端在不必指定产品的具体的情况下,创建多个产品族中的产品对象。根据里氏替换原则,任何接受父类型的地方,都应当能够接受子类型。因此,实际上系统所需要的,仅仅是类型与这些抽象产品角色相同的一些实例,而不是这些抽象产品的实例。换言之,也就是这些抽象产品的具体子类的实例。工厂类负责创建抽象产品的具体子类的实例。
设计步骤:(三国王者)
1.创建抽象工厂(国家(魏蜀吴))
package com.example.yancy.model.Abstract_Factory_Pattern;
/**
* 创建日期:2018/8/23 0023 on 10:05
* 描述:三国抽象工厂类
* 作者: yancy
*/
public interface Kingdom {
Shu factoryShu();
Wei factoryWei();
Wu factoryWu();
}
2.创建具体工厂
皇帝工厂
package com.example.yancy.model.Abstract_Factory_Pattern;
/**
* 创建日期:2018/8/23 0023 on 10:15
* 描述: 每个国家的皇帝
* 作者: yancy
*/
public class EmperorKingdom implements Kingdom{
@Override
public Shu factoryShu() {
return new LiuBei();
}
@Override
public Wei factoryWei() {
return new CaoPi();
}
@Override
public Wu factoryWu() {
return new SunQuan();
}
}
太子工厂
package com.example.yancy.model.Abstract_Factory_Pattern;
/**
* 创建日期:2018/8/23 0023 on 10:17
* 描述: 每个国家的太子
* 作者: yancy
*/
public class PrinceKingdom implements Kingdom{
@Override
public Shu factoryShu() {
return new LiuShan();
}
@Override
public Wei factoryWei() {
return new CaoRui();
}
@Override
public Wu factoryWu() {
return new SunLiang();
}
}
3.抽象国家
蜀国
package com.example.yancy.model.Abstract_Factory_Pattern;
/**
* 创建日期:2018/8/23 0023 on 10:07
* 描述:蜀国 刘备统治
* 作者: yancy
*/
public interface Shu {
}
魏国
package com.example.yancy.model.Abstract_Factory_Pattern;
/**
* 创建日期:2018/8/23 0023 on 10:07
* 描述: 魏国 曹丕统治
* 作者: yancy
*/
public interface Wei {
}
吴国
package com.example.yancy.model.Abstract_Factory_Pattern;
/**
* 创建日期:2018/8/23 0023 on 10:07
* 描述: 吴国 孙权统治
* 作者: yancy
*/
public interface Wu {
}
4.具体国家人物
刘备
package com.example.yancy.model.Abstract_Factory_Pattern;
/**
* 创建日期:2018/8/23 0023 on 10:18
* 描述:刘备
* 作者: yancy
*/
public class LiuBei implements Shu{
}
刘禅
package com.example.yancy.model.Abstract_Factory_Pattern;
/**
* 创建日期:2018/8/23 0023 on 10:21
* 描述:刘禅
* 作者: yancy
*/
public class LiuShan implements Shu{
}
曹丕
package com.example.yancy.model.Abstract_Factory_Pattern;
/**
* 创建日期:2018/8/23 0023 on 10:19
* 描述:曹丕
* 作者: yancy
*/
public class CaoPi implements Wei{
}
曹睿
package com.example.yancy.model.Abstract_Factory_Pattern;
/**
* 创建日期:2018/8/23 0023 on 10:20
* 描述:曹睿
* 作者: yancy
*/
public class CaoRui implements Wei{
}
孙权
package com.example.yancy.model.Abstract_Factory_Pattern;
/**
* 创建日期:2018/8/23 0023 on 10:18
* 描述:孙权
* 作者: yancy
*/
public class SunQuan implements Wu{
}
孙亮
package com.example.yancy.model.Abstract_Factory_Pattern;
/**
* 创建日期:2018/8/23 0023 on 10:23
* 描述:孙亮
* 作者: yancy
*/
public class SunLiang implements Wu{
}
在真实的系统中,产品等级结构的数目与每个产品等级结构中产品的数目(产品族)一般是不相等的。
有多少个产品等级结构,就会在工厂角色中发现多少个工厂方法。
优点:
1.它分离了具体的类
2.它使得易于交换产品系列
3.它有利于产品的一致性
缺点:
难以支持新种类的产品。
一般情况下,有多少个抽象产品,就有多少个工厂方法。(比如再增加皇后)。
OCP(开放-封闭原则(The Open-Close Principle,简称OCP))
在不改变产品等级结构的情况下,增加产品族就是意味着向每一个产品等级结构中增加一个或者多个新的具体产品角色,这时只需要向工厂等级结构中增加新的元素就可以了,具体的说,只需要增加新的具体工厂类就可以了。
在产品族数目不变的情况下,增加产品等级结构,相当于增加一个与现有产品等级结构平行的一个新的产品等级结构,这时需要修改所有的工厂角色,增加一个新的工厂方法,这是不支持OCP的。