设计模式之抽象工厂模式
2015-12-10 16:20
288 查看
抽象工厂模式的理解估计就是首先得弄清楚产品族是什么意思了,只有理解了这个才能比较好的理解抽象工厂模式。
产品等级结构:
产品等级结构指的是同一类型的产品组成的结构。
产品族:
所谓产品族指的是位于不同产品登记结构中,功能相关联的产品组成的家族。
这个图应该能看懂什么是产品族了
下面用程序来实现这个抽象工厂模式,具体理解下:
代码清单截图如下:
Creator.java:工厂的抽象(核心)
<span style="font-size:14px;">package desgin_abstractFactory.cn;
public interface Creator {
//产品A等级结构的工厂方法
public ProductA factoryA();
//产品B等级结构的工厂方法
public ProductB factoryB();
}</span>ConcreteCreator1.java (一个具体工厂)
<span style="font-size:14px;">package desgin_abstractFactory.cn;
public class ConcreteCreator1 implements Creator {
//一个工厂负责创建一个产品族的对象
@Override
public ProductA factoryA() {
return new ProductA2();
}
@Override
public ProductB factoryB() {
return new ProductB1();
}
}</span>
ConcreteCreator2.java (另一个具体工厂)
<span style="font-size:14px;">package desgin_abstractFactory.cn;
public class ConcreteCreator2 implements Creator{
//一个工厂负责一个产品族的对象创建
@Override
public ProductA factoryA() {
return new ProductA1();
}
@Override
public ProductB factoryB() {
return new ProductB2();
}
}</span>
ProductA.java (一个产品抽象)
<span style="font-size:14px;">package desgin_abstractFactory.cn;
public interface ProductA {
//产品自我描述
public void intorduceA();
}
</span>ProductA1.java (产品A的具体实现)
<span style="font-size:14px;">package desgin_abstractFactory.cn;
public class ProductA1 implements ProductA{
@Override
public void intorduceA() {
System.out.println("这是ProductA1产品");
}
}</span>
ProductA2.java (产品A的另一具体实现)
<span style="font-size:14px;">package desgin_abstractFactory.cn;
public class ProductA2 implements ProductA {
@Override
public void intorduceA() {
System.out.println("这是ProductA2产品");
}
}</span>
ProductB.java (另一个产品抽象)
<span style="font-size:14px;">package desgin_abstractFactory.cn;
public interface ProductB {
//产品自我描述
public void introduceB();
}</span>
ProductB1.java (产品B的实现)
<span style="font-size:14px;">package desgin_abstractFactory.cn;
public class ProductB1 implements ProductB{
@Override
public void introduceB() {
System.out.println("这是ProductB1产品");
}
}</span>
ProductB2.java (产品B的另一实现)
<span style="font-size:14px;">package desgin_abstractFactory.cn;
public class ProductB2 implements ProductB{
@Override
public void introduceB() {
System.out.println("这是ProductB2产品");
}
}</span>
新增一个Client.java 给工厂发指令生产什么产品族的产品
Client.java (客户端)
<span style="font-size:14px;">package desgin_abstractFactory.cn;
public class Client {
public static void main(String []args){
//我需要一个产品族的产品,给我全部生产出来
Creator products1 = new ConcreteCreator1();
products1.factoryA().intorduceA();
products1.factoryB().introduceB();
System.out.println("********************");
//我现在需要另一个产品族的全部产品,给我生产歘来
Creator products2 = new ConcreteCreator2();
products2.factoryA().intorduceA();
products2.factoryB().introduceB();
}
}</span>
程序运行结果:
这是ProductA2产品
这是ProductB1产品
********************
这是ProductA1产品
这是ProductB2产品
以下场景适合使用抽象工厂模式来设计系统:
1、一个系统不应当依赖产品实例如何被创建,组合,和表达的细节,这对有所有形态的工厂模式都是尤为重要的
2、这个系统的产品有多于一个的产品族,而系统只消费其中某一种产品族
3、同属于一个产品族的的产品一起使用的 ,这一约束必须在系统设计中体现出来
4、系统提供一个产品类的库,所有的产品以同样的接口实现,从而使客户端不依赖 于实现
总结:
在没有理解产品族之前一直弄不懂工厂方法模式和抽象工厂模式有什么区别,而现在能理解了,工厂方法模式是对应一个产品等级 结构的,而抽象工厂模式是对于的一个产品族的。
产品等级结构:
产品等级结构指的是同一类型的产品组成的结构。
产品族:
所谓产品族指的是位于不同产品登记结构中,功能相关联的产品组成的家族。
这个图应该能看懂什么是产品族了
下面用程序来实现这个抽象工厂模式,具体理解下:
代码清单截图如下:
Creator.java:工厂的抽象(核心)
<span style="font-size:14px;">package desgin_abstractFactory.cn;
public interface Creator {
//产品A等级结构的工厂方法
public ProductA factoryA();
//产品B等级结构的工厂方法
public ProductB factoryB();
}</span>ConcreteCreator1.java (一个具体工厂)
<span style="font-size:14px;">package desgin_abstractFactory.cn;
public class ConcreteCreator1 implements Creator {
//一个工厂负责创建一个产品族的对象
@Override
public ProductA factoryA() {
return new ProductA2();
}
@Override
public ProductB factoryB() {
return new ProductB1();
}
}</span>
ConcreteCreator2.java (另一个具体工厂)
<span style="font-size:14px;">package desgin_abstractFactory.cn;
public class ConcreteCreator2 implements Creator{
//一个工厂负责一个产品族的对象创建
@Override
public ProductA factoryA() {
return new ProductA1();
}
@Override
public ProductB factoryB() {
return new ProductB2();
}
}</span>
ProductA.java (一个产品抽象)
<span style="font-size:14px;">package desgin_abstractFactory.cn;
public interface ProductA {
//产品自我描述
public void intorduceA();
}
</span>ProductA1.java (产品A的具体实现)
<span style="font-size:14px;">package desgin_abstractFactory.cn;
public class ProductA1 implements ProductA{
@Override
public void intorduceA() {
System.out.println("这是ProductA1产品");
}
}</span>
ProductA2.java (产品A的另一具体实现)
<span style="font-size:14px;">package desgin_abstractFactory.cn;
public class ProductA2 implements ProductA {
@Override
public void intorduceA() {
System.out.println("这是ProductA2产品");
}
}</span>
ProductB.java (另一个产品抽象)
<span style="font-size:14px;">package desgin_abstractFactory.cn;
public interface ProductB {
//产品自我描述
public void introduceB();
}</span>
ProductB1.java (产品B的实现)
<span style="font-size:14px;">package desgin_abstractFactory.cn;
public class ProductB1 implements ProductB{
@Override
public void introduceB() {
System.out.println("这是ProductB1产品");
}
}</span>
ProductB2.java (产品B的另一实现)
<span style="font-size:14px;">package desgin_abstractFactory.cn;
public class ProductB2 implements ProductB{
@Override
public void introduceB() {
System.out.println("这是ProductB2产品");
}
}</span>
新增一个Client.java 给工厂发指令生产什么产品族的产品
Client.java (客户端)
<span style="font-size:14px;">package desgin_abstractFactory.cn;
public class Client {
public static void main(String []args){
//我需要一个产品族的产品,给我全部生产出来
Creator products1 = new ConcreteCreator1();
products1.factoryA().intorduceA();
products1.factoryB().introduceB();
System.out.println("********************");
//我现在需要另一个产品族的全部产品,给我生产歘来
Creator products2 = new ConcreteCreator2();
products2.factoryA().intorduceA();
products2.factoryB().introduceB();
}
}</span>
程序运行结果:
这是ProductA2产品
这是ProductB1产品
********************
这是ProductA1产品
这是ProductB2产品
以下场景适合使用抽象工厂模式来设计系统:
1、一个系统不应当依赖产品实例如何被创建,组合,和表达的细节,这对有所有形态的工厂模式都是尤为重要的
2、这个系统的产品有多于一个的产品族,而系统只消费其中某一种产品族
3、同属于一个产品族的的产品一起使用的 ,这一约束必须在系统设计中体现出来
4、系统提供一个产品类的库,所有的产品以同样的接口实现,从而使客户端不依赖 于实现
总结:
在没有理解产品族之前一直弄不懂工厂方法模式和抽象工厂模式有什么区别,而现在能理解了,工厂方法模式是对应一个产品等级 结构的,而抽象工厂模式是对于的一个产品族的。
相关文章推荐
- slideview 侧滑时上下滚动 onitemclick和滑动的冲突 解决方法
- Mahout学习资料整理
- 基于贪心算法的几类区间覆盖问题
- 极客书的编程教程合集
- 学习掌握oracle外表(external table)
- 内存泄漏弄个明白
- 对自定义函数使用不当的调优案例
- Spring没有对ORM模块提供自己的实现,只对JDBC和其他ORM框架进行了封装。
- JQ中的post跟get
- [UWP开发]在windows10中设置壁纸~UserProfilePersonalizationSettings
- 提高网页响应速度
- JS—简单年历表
- Bonfire: Return Largest Numbers in Arrays
- 2016年Win10重大更新RedStone版与win10 th2版有什么不同?
- OCP-1Z0-051-2015-58题
- 如何在github上创建一个开源工程
- 一种基于TLS的高级反调试技术
- 文件中类的存放
- 如何在真机上调试Android应用程序(图文详解)
- Integer等等和equals的注意之处