2013-10-09 35 views
2

我看着使用抽象工厂和工厂方法的例子。但是,我怎么才能正确地将两者结合起来,因此抽象工厂会选择需要哪个混凝土工厂,然后工厂方法会选择在给定工厂中创建什么。 我试图用这些模式让自己成为一个程序,但却陷入了死胡同。不能弄清楚如何正确地结合这两种模式来使我的程序工作。我的程序非常简单。它只是创建家具 - 无论是桌子还是椅子,取决于所选择的混凝土工厂。Java - 如何正确地将Abstract Factory与Factory方法结合使用?

然后它会创建圆桌或方桌,如果表工厂将被选中(也写作类型,无论是圆形或方形)。然后,如果选择该工厂,那么椅子工厂也是如此。

所以我的代码看起来像这样(有些部分可能是不正确的,这就是为什么我问这个问题):

package pack1; 
//abstract product 
public abstract class Table { 
    protected final String name; 
    public Table(String name) { 
     this.name = name; 
    } 
} 

package pack1; 
//concrete product 
public class SquareTable extends Table { 
    public SquareTable(String name) { 
     super(name); 
    } 

} 

package pack1; 
//concrete product 
public class RoundTable extends Table { 
    public RoundTable(String name) { 
     super(name); 
    } 
} 

package pack1; 
//abstract product 
public abstract class Chair { 
    protected final String name; 
     public Chair(String name) { 
      this.name = name; 
     } 
} 

package pack1; 
//concrete product 
public class WoodenChair extends Chair { 
    public WoodenChair(String name) { 
     super(name); 
    } 
} 

package pack1; 
//concrete product 
public class MetalChair extends Chair { 
    public MetalChair(String name) { 
     super(name); 
    } 

} 

package pack1; 
//Abstract Factory 
public interface AbstractFurnitureFactory { 
    public Table createTable(String type, String name); 
    //not finished. How to use different create methods for different factories, 
    //so it wouldn't require to use this method in concrete factories or 
    //do I need 2 concrete factories for this to work?.. 
} 

package pack1; 
//concrete factory 
public class TableFactory implements AbstractFurnitureFactory { 
    public Table createTable(String type, String name){ 
    if(type.equals("square"))      
    { 
     SquareTable sq_table=new SquareTable(name); 
     return sq_table; 
    } 
    else 
    { 
     RoundTable rn_table=new RoundTable(name); 
     return rn_table; 
    } 
} 

} 

package pack1; 
//concrete factory 
public class ChairFactory { 
    public Chair createChair(String type, String name){ 
     if(type.equals("wood"))      
     { 
      WoodenChair wd_chair=new WoodenChair(name); 
      return wd_chair; 
     } 
     else 
     { 
      MetalChair mt_chair=new MetalChair(name); 
      return mt_chair; 
     } 
    } 
} 

package pack1; 
//client 
public class FurnitureBuilder { 
    public void buildTable(AbstractFurnitureFactory tf) 
     { 
      //Table table = tf.createTable(); 
      //table.name = "New table"; 
      //not Finished. Java won't let me set arguments in createTable 
      //method for example. It gives error - 'The method 
      //createTable(String, String) in the type 
      //AbstractFurnitureFactory is not applicable for the arguments()' 
     } 

} 

package pack1; 

public class Main { 
    public static void main(String[] args) 
    { 
     //FurnitureBuilder builder = new FurnitureBuilder(); 
     //AbstractFurnitureFactory TableFactory = null; 
     //Not finished as some parts are missing. 

    } 
} 

因此,如果任何人都可以精确定位和/或解决什么,我做错了,我非常感谢它。

回答

0

我认为你在混淆哪个工厂应该从哪个抽象工厂继承。

更好的Factory设计应该是让同一工厂制造不同种类的TablesChairs。这使得AbstractFurnitureFactory不需要。

例如:

public interface TableFactory{ 

    Table createTable(String name); 
    } 


public class SquareTableFactory implements TableFactory{ 
    @Override 
    Table createTable(String name){ 
      return new SquareTable(name); 
    } 
} 

public class RoundTableFactory implements TableFactory{ 
    @Override 
    Table createTable(String name){ 
      return new RoundTable(name); 
    } 
} 

然后

public class FurnitureBuilder { 
    private final TableFactory tf; 
    private final ChairFactory cf; 

    ... 

    public void buildTable(String name){ 
     Table table = tf.createTable(name); 
     ... 
    } 

}

希望这使事情变得更加清晰。