抽象工厂模式 Idea

作者: 太阳上的雨天 分类: Java,Java,设计模式 发布时间: 2022-02-08 16:31

抽象工厂模式 AbstractFactory

抽象工厂模式其实就是多个工厂方法模式

AbstractFactory抽象工厂类

下述代码是一个抽象工厂类,它的职责是定义每个工厂要实现的功能,有n个产品族,在抽象工厂类中就应该有n个创建方法。这里按上述类图,给出A、B两个产品族,即构造两个方法

package com.learn.Factory.AbstractFactory;

abstract class AbstractFactory {

    public abstract ProductA createProductA();

    public abstract AbstractProductB createProductB();

}

AbstractProductA

抽象产品A类

package com.learn.Factory.AbstractFactory;

abstract class AbstractProductA {

    public abstract void doSomething();

}

AbstractProductB

抽象产品B类

package com.learn.Factory.AbstractFactory;

abstract class AbstractProductB {

    public void shareMethod() {}

    public abstract void doSomething();

}

ConcreteFactoryA

A产品具体工厂实现类

package com.learn.Factory.AbstractFactory;

public class ConcreteFactoryA extends AbstractFactory{

    @Override
    public AbstractProductA createProductA() {
        return new ProductA();
    }

    public AbstractProductB createProductB() {
        return new ProductB();
    }
}

ConcreteFactoryB

B产品具体工厂实现类

package com.learn.Factory.AbstractFactory;

public class ConcreteFactoryB extends AbstractFactory{
    @Override
    public ProductA createProductA() {
        return new ProductA();
    }

    @Override
    public AbstractProductB createProductB() {
        return new ProductB();
    }
}

ProductA

产品A

package com.learn.Factory.AbstractFactory;

public class ProductA extends AbstractProductA{
    @Override
    public boolean doSomething() {
        System.out.println("产品A实现方法");
        return false;
    }
}

ProductB

产品B

package com.learn.Factory.AbstractFactory;

public class ProductB extends AbstractProductB{
    @Override
    public boolean doSomething() {
        System.out.println("产品B实现方法");
        return false;
    }
}

客户端

在客户端中,没有任何一个方法与实现类有关系,对于一个产品来说,我们只需要知道它的工厂方法就可以直接产生一个产品对象,没必要关心他的实现类

package com.learn.Factory.AbstractFactory;

public class Client {

    public static void main(String[] args) {
        ConcreteFactoryA concreteFactoryA = new ConcreteFactoryA();
        ConcreteFactoryB concreteFactoryB = new ConcreteFactoryB();

        System.out.println(concreteFactoryA.createProductA().doSomething());
        System.out.println(concreteFactoryB.createProductB().doSomething());
    }

}

缺点:
产品族扩展非常困难,改动或增加一个产品需同时改动多个类

发表回复

您的电子邮箱地址不会被公开。 必填项已用 * 标注