本文是在学习中的总结,欢迎转载但请注明出处:http://blog.csdn.net/pistolove/article/details/46440915
抽象工厂模式是对象的创建模式,它是工厂方法模式的进一步推广。
抽象工厂模式与工厂方法模式的最大区别就在于工厂方法模式针对的是一个产品等级结构;而抽象工厂模式则需要面对多个产品等级结构。
假设一个子系统需要一些产品对象,而这些产品又属于一个以上的产品等级结构。那么为了将消费这些产品对象的责任和创建这些产品对象的责任分割开来,可以引进抽象工厂模式。这样的话,消费产品的一方不需要直接参与产品的创建工作,而只需要向一个公用的工厂接口请求所需要的产品。
优点:
(1)分离接口和实现
客户端使用抽象工厂来创建需要的对象,而客户端根本就不知道具体的实现是谁,客户端只是面向产品的接口编程而已。也就是说,客户端从具体的产品实现中解耦。
(2)使切换产品族变得容易
因为一个具体的工厂实现代表的是一个产品族,比如上面例子的从A产品到B产品只需要切换一下具体工厂。
缺点:
(1)不太容易扩展新的产品
如果需要给整个产品族添加一个新的产品,那么就需要修改抽象工厂,这样就会导致修改所有的工厂实现类。
通过下面代码来熟悉抽象工厂模式:
不同的抽象工厂:
package com.design.abstractFactory;
//每一种牌子的产品负责生产工厂,即不同的厂商负责自己牌子的生产
public abstract class Factory1 {
abstract public IproductA getproductA1();
abstract public IproductB getProductB1();
}
package com.design.abstractFactory;
public abstract class Factory2 {
abstract public IproductA getproductA2();
abstract public IproductB getproductB2();
}
不同的具体工厂:
package com.design.abstractFactory;
//具体的工厂生产产品
public class ConcreateFactory1 extends Factory1 {
@Override
public IproductA getproductA1() {
return new ProductA1();
}
@Override
public IproductB getProductB1() {
return new ProductB1();
}
}
package com.design.abstractFactory;
public class ConcreateFactory2 extends Factory2{
@Override
public IproductA getproductA2() {
return new ProductA2();
}
@Override
public IproductB getproductB2() {
return new ProductB2();
}
}
定义不同的产品接口:
package com.design.abstractFactory;
//定义不同的产品之间的一定具备的标准,用interface实现
public interface IproductA {
public void method();
}
package com.design.abstractFactory;
public interface IproductB {
public void method();
}
不同的具体产品:
package com.design.abstractFactory;
//实现了产品标准实现的一系列具体产品
public class ProductA1 implements IproductA {
@Override
public void method() {
System.err.println("A1产品生产A1");
}
}
package com.design.abstractFactory;
public class ProductA2 implements IproductA {
@Override
public void method() {
System.err.println("A2生产产品A2");
}
}
package com.design.abstractFactory;
public class ProductB1 implements IproductB {
@Override
public void method() {
System.err.println("B1生产产品B1");
}
}
package com.design.abstractFactory;
public class ProductB2 implements IproductB {
@Override
public void method() {
System.err.println("B2生产产品B2");
}
}
客户端实现:
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();
}
}
测试结果:
A1产品生产A1
B1生产产品B1