我有一个接口,说VegetableCreation
方法:
public void writeVeggieDataIntoFile();
以及两个不同的类,称为Apple
和实现VegetableCreation
的Mango
。
并且有一个带有create()
方法的工厂类VegetableFactory
:
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
}
}
}
我在这里基本上要实现的是,当我从客户端类的main()
方法调用VegetableFactory
类的create()
方法并将除"Apple"
或"Mango"
以外的任何字符串值作为运行时参数传递时。我希望两个不同的线程在每个Apple
上工作,Mango
对象并同时处理每个writeVeggieDataIntoFile()
方法。
任何关于设计策略/或使用哪些并发API等的建议将不胜感激。
PS:我应该称它为水果**而不是蔬菜*
查看复合模式,然后构建一个 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();
附言。 你的蔬菜对我来说就像水果!
我希望从一家名为VegetableFactory
/FruitFactory
的工厂获得Vegetable
/Fruit
,而不是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 {
...
}
为了类型安全,我会使用特定的get...()
方法(因为它通常在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 文档:
未经检查的异常不需要在方法 [...] 抛出子句中声明
首先,我会让你的工厂有静态创建。 然后在水果的创建执行项实例中,创建水果线程。 否则,如果蔬菜的项目实例,则做蔬菜线。