抽象工厂模式 Idea
抽象工厂模式 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());
}
}
缺点:
产品族扩展非常困难,改动或增加一个产品需同时改动多个类