1.意图
将抽象部分和它的实现部分分离,使它们都可以独立变化
2.参与者
Abstraction - 定义抽象接口
- 维护一个指向Implementor类型对象的指针
RefindAbstraction -扩充由Abstraction定义的接口
Implementor -定义实现类的接口,该接口不一定与 Abstraction的接口完全
一致,事实上这两个接口可以完全不同,一般来讲,Implementor
接口仅提供基本操作,而Abstraction则定义了基于这些操作的较高
层的操作
ConcreteImplementor - 实现Implementor接口并定义它的实现。
3.结构
4.代码
public interface Abstraction {
public Implementor getImplementor();
}
public class RefindAbstractionA implements Abstraction {
@Override
public Implementor getImplementor() {
return (Implementor) AbstractFactory.Instance().getObject("A");
}
public void draw(){
System.out.println("RefindAbstractionA");
getImplementor().draw();
}
}
public class RefindAbstractionB implements Abstraction {
@Override
public Implementor getImplementor() {
return (Implementor) AbstractFactory.Instance().getObject("B");
}
public void draw(){
System.out.println("RefindAbstractionB");
getImplementor().draw();
}
}
public class ConcreteImplementorA implements Implementor {
@Override
public void draw() {
System.out.println("draw line");
}
}
public class ConcreteImplementorB implements Implementor {
@Override
public void draw() {
System.out.println("draw clycle");
}
}
public class AbstractFactory {
private Map<String, Object> ObjectMap = new HashMap<String, Object>();
private final static AbstractFactory abstractFactory = new AbstractFactory();
private AbstractFactory(){
register("A",new ConcreteImplementorA());
register("B",new ConcreteImplementorB());
}
public static AbstractFactory Instance(){
return abstractFactory;
}
public void register(String flag,Object o){
Object oo = ObjectMap.get(flag);
if(oo != null){
throw new RuntimeException(flag+"标识已存在请重新定义一个标识!");
}
ObjectMap.put(flag, o);
}
public Object getObject(String flag){
Object o = ObjectMap.get(flag);
if(o == null){
throw new RuntimeException(flag+"标识不存在!");
}
return o;
}
}
public class Client {
public static void main(String[] args) {
RefindAbstractionB B = new RefindAbstractionB();
B.draw();
}
}
注释:抽象工厂我只是存储对象并没有新建对象,所以对象存在可以改变的对象变量的时候不要使用。