具有继承类的抽象工厂模式

时间:2015-04-21 10:59:30

标签: java inheritance abstract-factory

我想实现抽象工厂模式。 我有三个班级

  1. 超类(SC)
  2. 子类(childA,应继承自sc)
  3. 子类(childB,也应继承自sc)
  4. 到目前为止,我所做的是为超类实现抽象工厂设计模式。我还没有继承过这种遗产。我不知道如何用两个子类实现模式。我需要添加什么?

    AbstractFactory

    public abstract class AbstractFactory {
    
        public abstract SC createNewSC();
    
    }
    

    SCConcreteFactory

    public class SCConcreteFactory extends AbstractFactory {
    
        @Override
        public SC createNewSC() {
            return new SC();
        }
    }
    

    AbstractSC

    public abstract class AbstractSC{
        public abstract void doStuff();
    }
    

    SC

    public class SC extends AbstractSC{
    
        @Override
        public void doStuff() {
            System.out.println("Hello World");
        }
    
    }
    

2 个答案:

答案 0 :(得分:1)

在这篇文章中解释了创建具有继承的抽象工厂的一种非常详细的方法:http://www.oodesign.com/abstract-factory-pattern.html

如果您的SC超类也是抽象的,您可以轻松地理解这一点:

public abstract class AbstractFactory {
    public abstract SC sc();
}

public class ChildAFactory extends AbstractFactory {
    public SC sc(){ return new ChildA();}
}

public class ChildBFactory extends AbstractFactory {
    public SC sc(){ return new ChildB();}
}

和上面提到的文章一样:

class FactoryMaker{
  private static AbstractFactory pf=null;
  static AbstractFactory getFactory(String choice){
    if(choice.equals("a")){
        pf=new ChildAFactory();
    }else if(choice.equals("b")){
        pf=new ChildBFactory();
    } return pf;
  }
 }

// Client
public class Client{
  public static void main(String args[]){
    AbstractFactory pf= FactoryMaker.getFactory("a");
    SC sc = pf.sc(); // ChildA is initialized
   }
}

有几种方法可以使用抽象工厂 - 这取决于您的要求。这是一种非常简单的方法,可能会根据您的要求而改变。例如,上述解决方案仅试图隐藏具体实现。客户端只知道SC。

HTH,Sabine

答案 1 :(得分:1)

您需要分别为Child和Child实现两个工厂,例如:

public class ChildAFactory extends AbstractFactory {

    @Override
    public SC createNewSC() {
        return new ChildA();
    }
}

public class ChildBFactory extends AbstractFactory {

    @Override
    public SC createNewSC() {
        return new ChildB();
    }
}