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.
}
}
因此,如果任何人都可以精确定位和/或解决什么,我做错了,我非常感谢它。