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