关于抽象工厂的学习理解
2017-10-10 10:21
225 查看
本文是在学习中的总结,欢迎转载但请注明出处:http://blog.csdn.net/pistolove/article/details/46440915
抽象工厂模式是对象的创建模式,它是工厂方法模式的进一步推广。
抽象工厂模式与工厂方法模式的最大区别就在于工厂方法模式针对的是一个产品等级结构;而抽象工厂模式则需要面对多个产品等级结构。
假设一个子系统需要一些产品对象,而这些产品又属于一个以上的产品等级结构。那么为了将消费这些产品对象的责任和创建这些产品对象的责任分割开来,可以引进抽象工厂模式。这样的话,消费产品的一方不需要直接参与产品的创建工作,而只需要向一个公用的工厂接口请求所需要的产品。
优点:
(1)分离接口和实现
客户端使用抽象工厂来创建需要的对象,而客户端根本就不知道具体的实现是谁,客户端只是面向产品的接口编程而已。也就是说,客户端从具体的产品实现中解耦。
(2)使切换产品族变得容易
因为一个具体的工厂实现代表的是一个产品族,比如上面例子的从A产品到B产品只需要切换一下具体工厂。
缺点:
(1)不太容易扩展新的产品
如果需要给整个产品族添加一个新的产品,那么就需要修改抽象工厂,这样就会导致修改所有的工厂实现类。
通过下面代码来熟悉抽象工厂模式:
不同的抽象工厂:
(不同的工厂用来生产不同的产品)
[java] view
plain copy
package com.design.abstractFactory;
//每一种牌子的产品负责生产工厂,即不同的厂商负责自己牌子的生产
public abstract class Factory1 {
abstract public IproductA getproductA1();
abstract public IproductB getProductB1();
}
[java] view
plain copy
package com.design.abstractFactory;
public abstract class Factory2 {
abstract public IproductA getproductA2();
abstract public IproductB getproductB2();
}
不同的具体工厂:
(实现抽象工厂的方法,返回具体生产的产品)
[java] view
plain copy
package com.design.abstractFactory;
//具体的工厂生产产品
public class ConcreateFactory1 extends Factory1 {
@Override
public IproductA getproductA1() {
return new ProductA1();
}
@Override
public IproductB getProductB1() {
return new ProductB1();
}
}
[java] view
plain copy
package com.design.abstractFactory;
public class ConcreateFactory2 extends Factory2{
@Override
public IproductA getproductA2() {
return new ProductA2();
}
@Override
public IproductB getproductB2() {
return new ProductB2();
}
}
定义不同的产品接口:
(产品接口用来统一产品的生产方法)
[java] view
plain copy
package com.design.abstractFactory;
//定义不同的产品之间的一定具备的标准,用interface实现
public interface IproductA {
public void method();
}
[java] view
plain copy
package com.design.abstractFactory;
public interface IproductB {
public void method();
}
不同的具体产品:
(具体的实现,在使用时声明抽象工厂,调用具体实现)
[java] view
plain copy
package com.design.abstractFactory;
//实现了产品标准实现的一系列具体产品
public class ProductA1 implements IproductA {
@Override
public void method() {
System.err.println("A1产品生产A1");
}
}
[java] view
plain copy
package com.design.abstractFactory;
public class ProductA2 implements IproductA {
@Override
public void method() {
System.err.println("A2生产产品A2");
}
}
[java] view
plain copy
package com.design.abstractFactory;
public class ProductB1 implements IproductB {
@Override
public void method() {
System.err.println("B1生产产品B1");
}
}
[java] view
plain copy
package com.design.abstractFactory;
public class ProductB2 implements IproductB {
@Override
public void method() {
System.err.println("B2生产产品B2");
}
}
客户端实现:
[java] view
plain copy
package com.design.abstractFactory;
public class Client {
public static void main(String[] args) {
Factory1 factory = new ConcreateFactory1();
IproductA a1 = factory.getproductA1();
IproductB b1 = factory.getProductB1();
a1.method();
b1.method();
}
}
抽象工厂的使用:
1.声明抽象工厂
2.具体实现抽象工厂
3.定义产品统一的生产方式
4.具体产品实现生产方式生产不同的产品
5.声明抽象工厂,调用不同的具体实现工厂,生产不同的产品。
测试结果:
A1产品生产A1
B1生产产品B1
抽象工厂模式是对象的创建模式,它是工厂方法模式的进一步推广。
抽象工厂模式与工厂方法模式的最大区别就在于工厂方法模式针对的是一个产品等级结构;而抽象工厂模式则需要面对多个产品等级结构。
假设一个子系统需要一些产品对象,而这些产品又属于一个以上的产品等级结构。那么为了将消费这些产品对象的责任和创建这些产品对象的责任分割开来,可以引进抽象工厂模式。这样的话,消费产品的一方不需要直接参与产品的创建工作,而只需要向一个公用的工厂接口请求所需要的产品。
优点:
(1)分离接口和实现
客户端使用抽象工厂来创建需要的对象,而客户端根本就不知道具体的实现是谁,客户端只是面向产品的接口编程而已。也就是说,客户端从具体的产品实现中解耦。
(2)使切换产品族变得容易
因为一个具体的工厂实现代表的是一个产品族,比如上面例子的从A产品到B产品只需要切换一下具体工厂。
缺点:
(1)不太容易扩展新的产品
如果需要给整个产品族添加一个新的产品,那么就需要修改抽象工厂,这样就会导致修改所有的工厂实现类。
通过下面代码来熟悉抽象工厂模式:
不同的抽象工厂:
(不同的工厂用来生产不同的产品)
[java] view
plain copy
package com.design.abstractFactory;
//每一种牌子的产品负责生产工厂,即不同的厂商负责自己牌子的生产
public abstract class Factory1 {
abstract public IproductA getproductA1();
abstract public IproductB getProductB1();
}
[java] view
plain copy
package com.design.abstractFactory;
public abstract class Factory2 {
abstract public IproductA getproductA2();
abstract public IproductB getproductB2();
}
不同的具体工厂:
(实现抽象工厂的方法,返回具体生产的产品)
[java] view
plain copy
package com.design.abstractFactory;
//具体的工厂生产产品
public class ConcreateFactory1 extends Factory1 {
@Override
public IproductA getproductA1() {
return new ProductA1();
}
@Override
public IproductB getProductB1() {
return new ProductB1();
}
}
[java] view
plain copy
package com.design.abstractFactory;
public class ConcreateFactory2 extends Factory2{
@Override
public IproductA getproductA2() {
return new ProductA2();
}
@Override
public IproductB getproductB2() {
return new ProductB2();
}
}
定义不同的产品接口:
(产品接口用来统一产品的生产方法)
[java] view
plain copy
package com.design.abstractFactory;
//定义不同的产品之间的一定具备的标准,用interface实现
public interface IproductA {
public void method();
}
[java] view
plain copy
package com.design.abstractFactory;
public interface IproductB {
public void method();
}
不同的具体产品:
(具体的实现,在使用时声明抽象工厂,调用具体实现)
[java] view
plain copy
package com.design.abstractFactory;
//实现了产品标准实现的一系列具体产品
public class ProductA1 implements IproductA {
@Override
public void method() {
System.err.println("A1产品生产A1");
}
}
[java] view
plain copy
package com.design.abstractFactory;
public class ProductA2 implements IproductA {
@Override
public void method() {
System.err.println("A2生产产品A2");
}
}
[java] view
plain copy
package com.design.abstractFactory;
public class ProductB1 implements IproductB {
@Override
public void method() {
System.err.println("B1生产产品B1");
}
}
[java] view
plain copy
package com.design.abstractFactory;
public class ProductB2 implements IproductB {
@Override
public void method() {
System.err.println("B2生产产品B2");
}
}
客户端实现:
[java] view
plain copy
package com.design.abstractFactory;
public class Client {
public static void main(String[] args) {
Factory1 factory = new ConcreateFactory1();
IproductA a1 = factory.getproductA1();
IproductB b1 = factory.getProductB1();
a1.method();
b1.method();
}
}
抽象工厂的使用:
1.声明抽象工厂
2.具体实现抽象工厂
3.定义产品统一的生产方式
4.具体产品实现生产方式生产不同的产品
5.声明抽象工厂,调用不同的具体实现工厂,生产不同的产品。
测试结果:
A1产品生产A1
B1生产产品B1
相关文章推荐
- 关于抽象工厂的一些理解
- 关于深入学习Java的方式和理解
- 关于学习Linux的经典书籍 (深入理解Linux内核、Linux设备驱动程序等) .
- web开发JS学习(二)关于document.write会覆盖文档流的理解
- 关于跨平台的理解以及Unity的由来--Unity学习
- 关于学习Linux的经典书籍 (深入理解Linux内核、Linux设备驱动程序等)
- 关于activity的startActivityForResult / onActivityResult / setResult学习和理解
- (加精)关于面向对象的某些理解--- 抽象 继承
- Java学习中关于I/O的理解(File类)1
- 简单工厂、工厂方法和抽象工厂的学习笔记
- 学习笔记----------abstractfactory抽象工厂
- 设计模式学习笔记(一):抽象工厂
- 关于多线程并发包的一些学习理解(java.util.concurrent)
- 关于SharedPreferences共享参数的学习与理解
- 关于电脑启动流程,MBR,PBR的学学习和理解。
- PHP面向对象三大特点学习(充分理解抽象、封装、继承、多态)
- 关于数据库SQLite的学习与理解
- 图解抽象工厂,简单理解
- 关于图想亮度和对比度的学习理解
- 关于学习Linux的经典书籍 (深入理解Linux内核、Linux设备驱动程序等)