我有一个界面说VegetableCreation
,方法是:
public void writeVeggieDataIntoFile();
以及两个名为Apple
和Mango
的不同类,它们实现VegetableCreation
。
并且工厂类VegetableFactory
采用create()
方法:
public class VegetableFactory {
public VegetableCreation create(String arg0) {
if (arg0.equals("Apple"))
return new Apple();
else if (arg0.equals("Mango")
return new Mango();
else {
// create and return both apple and mango by spawning two different threads
// so that the writeVeggieDataIntoFile(); gets invoked concurrently
// for both apple and mango and two different file is created
}
}
}
我在此基本上要尝试实现的是当我从客户端类VegetableFactory
方法调用create()
类main()
方法时并传递除"Apple"
或"Mango"
以外的任何字符串值作为运行时参数。我希望两个不同的线程可以处理每个Apple
和Mango
对象,并在每个writeVeggieDataIntoFile()
方法上同时工作。
任何关于设计策略的建议/或使用哪些并发API等都将受到高度赞赏。
P.S。:我应该称它为水果**而不是蔬菜*
答案 0 :(得分:1)
查看Composite模式,然后构建一个CompositeVegetable,当被告知"做它的事情"启动两个线程,一个执行一个操作,另一个执行另一个操作。
public class BothVegetable implements Vegetable {
public void writeVeggieDataInfoFile() {
Thread thread1 = new Thread(new AppleRunnable());
Thread thread2 = new Thread(new MangoRunnable());
thread1.start();
thread2.start();
thread1.join();
thread2.join();
}
}
// and in your factory
return new CompositeVegetable();
PS。你的蔬菜看起来像水果!
答案 1 :(得分:0)
我希望从名为Vegetable
/ Fruit
的工厂获得VegetableFactory
/ FruitFactory
,而不是VegetableCreation
/ FruitCreation
我会避免在工厂方法中创建线程和文件作为副作用。
我还要将writeFruitDataIntoFile()
重命名/更改为write(Writer out)
,因为您写的内容由封闭的接口或类告知,并且您写入的位置由其方法参数告知。
如果您确实需要并发处理,请在write(...)
中创建一个主题并让工厂方法只返回Fruit
。
优点是:
write()
),而不是每创建Fruit
个对象。请参阅:
为了好的OO练习,我使用了一个界面:
interface Fruit {
void write(Writer out);
...
} // Fruit
它的抽象实现:
public abstract class AbstractFruit implements Fruit {
Data data;
public void write(Writer out) {
...
}
...
} // AbstractFruit
public classe Apple extends AbstractFruit implements Fruit {
...
}
public classe Mango extends AbstractFruit implements Fruit {
...
}
并且为了type safety我会使用特定的get...()
方法(通常是done in the Java API):
public class FruitFactory {
public static Fruit getApple() {
Fruit a = new Apple()
...
return a;
}
public static Fruit getMango() {
Fruit m = new Mango()
...
return m;
}
} // FruitFactory
或enum
:
interface Fruit {
enum Type {
APPLE,
MANGO
}
void write(Writer out);
...
} // Fruit
public class FruitFactory {
public static Fruit get(Fruit.Type fruitType) {
switch (fruitType) {
case Fruit.Type.APPLE:
Fruit a = new Apple()
...
return a;
break;
case Fruit.Type.MANGO:
Fruit m = new Mango()
...
return m;
break;
default:
throw new FruitTypeNotSupported/* Runtime, i.e. unchecked */Exception();
break;
}
} // get(...)
} // FruitFactory
请参阅RuntimeException
的API文档:
不需要在方法[...] throws子句
中声明未经检查的异常
答案 2 :(得分:-1)
首先,我会让你的工厂有静态创建。然后在create do item instanceof Fruit中创建fruit线程。否则如果项目instanceof蔬菜然后做菜线。