1.3抽象工厂模式(Abstract Factory Pattern)
如果我们有这样一个需求:具体工厂1和工厂2需要生产一些同类型的不同产品PA1、PB1、PA2、PB2。我们可以看到其中的具体工厂1和2是两个完全独立的,它们都有自己的产品族(如工厂1有产品PA1和PB1,如工厂2有产品PA2和PB2)。两者除了都是抽象工厂的子类,没有任何其他的交集,那么我们就可以尝试试抽象工厂模式。
我们来看看抽象工厂模式是怎么定义的:
提供一个接口,用于创建相关或依赖对象的家族,二不需要明确指定具体类。
我们的抽象工厂中包含一系列的去构造一个抽象产品的方法,而具体产品的实现则是放在了具体工厂(图中的A和B)中进行。
在抽象工厂模式中,抽象产品 (AbstractProduct) 可能是一个或多个(IUser、IDepartment),从而构成一个或多个产品族(Product Family)。 在只有一个产品族的情况下(如只用SqlserverFactory),抽象工厂模式实际上退化到工厂方法模式。

1.3.1.FactoryMethod应用实例

1.3.2.代码实现
1.3.2.1.定义抽象产品A
package com.tech.ability.mydesignpattern.mycreatepattern.AbstractFactory;
/**
- Created by kikop on 2019/1/20.
*/
public interface IProductA {
public void display();
}
1.3.2.2.定义抽象产品A实现1
package com.tech.ability.mydesignpattern.mycreatepattern.AbstractFactory;
/**
- Created by kikop on 2019/1/20.
*/
public class ProductA1 implements IProductA {
@Override
public void display() {
System.out.println(this.getClass().toString());
}
}
1.3.2.3.定义抽象产品A实现2
package com.tech.ability.mydesignpattern.mycreatepattern.AbstractFactory;
/**
- Created by kikop on 2019/1/20.
*/
public class ProductA2 implements IProductA {
@Override
public void display() {
System.out.println(this.getClass().toString());
}
}
1.3****.2.4****.定义抽象产品B
package com.tech.ability.mydesignpattern.mycreatepattern.AbstractFactory;
/**
- Created by kikop on 2019/1/20.
*/
public interface IProductB {
public void display();
}
1.3****.2.5****.定义抽象产品B实现1
package com.tech.ability.mydesignpattern.mycreatepattern.AbstractFactory;
/**
- Created by kikop on 2019/1/20.
*/
public class ProductB1 implements IProductB {
@Override
public void display() {
System.out.println(this.getClass().toString());
}
}
1.3****.2.6****.定义抽象产品B实现2
package com.tech.ability.mydesignpattern.mycreatepattern.AbstractFactory;
/**
- Created by kikop on 2019/1/20.
*/
public class ProductB2 implements IProductB {
@Override
public void display() {
System.out.println(this.getClass().toString());
}
}
1.3****.2.7****.定义抽象工厂
package com.tech.ability.mydesignpattern.mycreatepattern.AbstractFactory;
/**
-
定义抽象工厂
-
Created by kikop on 2019/1/20.
*/
public interface MyAbstractFactory {
public IProductA createProductA();
public IProductB createProductB();
}
1.3****.2.8****.定义抽象工厂实现1
package com.tech.ability.mydesignpattern.mycreatepattern.AbstractFactory;
/**
- Created by kikop on 2019/1/20.
*/
public class ConcreteFactory1 implements MyAbstractFactory {
@Override
public IProductA createProductA() {
return new ProductA1();
}
@Override
public IProductB createProductB() {
return new ProductB1();
}
}
1.3****.2.9****.定义抽象实现工厂2
package com.tech.ability.mydesignpattern.mycreatepattern.AbstractFactory;
/**
- Created by kikop on 2019/1/20.
*/
public class ConcreteFactory2 implements MyAbstractFactory {
@Override
public IProductA createProductA() {
return new ProductA2();
}
@Override
public IProductB createProductB() {
return new ProductB2();
}
}
1.3****.2.10****.抽象工厂测试
package com.tech.ability.mydesignpattern.mycreatepattern.AbstractFactory;
/**
- Created by kikop on 2019/1/20.
*/
public class AbstractFactoryTest {
/**
* 获取工厂1的产品族(pa1和pb1)
*/
private static void test() {
MyAbstractFactory myAbstractFactory = new ConcreteFactory1();
IProductA iProductA = myAbstractFactory.createProductA();
IProductB iProductB = myAbstractFactory.createProductB();
iProductA.display();
iProductB.display();
}
/**
* 获取工厂2的产品族(pa1和pb1)
*/
private static void test2() {
MyAbstractFactory myAbstractFactory = new ConcreteFactory2();
IProductA iProductA = myAbstractFactory.createProductA();
IProductB iProductB = myAbstractFactory.createProductB();
iProductA.display();
iProductB.display();
}
public static void main(String[] args) {
test();
System.out.println("-----------------------------");
test2();
}
}
网友评论