美文网首页
2019-01-20_抽象工厂模式

2019-01-20_抽象工厂模式

作者: kikop | 来源:发表于2019-01-20 16:58 被阅读0次

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),抽象工厂模式实际上退化到工厂方法模式。

图片3.png

1.3.1.FactoryMethod应用实例

图片4.png

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();

}

}

相关文章

网友评论

      本文标题:2019-01-20_抽象工厂模式

      本文链接:https://www.haomeiwen.com/subject/mxoxjqtx.html