在不同的线程上执行接口的两个不同实现



我有一个接口,说VegetableCreation方法:

public void writeVeggieDataIntoFile();

以及两个不同的类,称为Apple和实现VegetableCreationMango

并且有一个带有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 文档:

未经检查的异常不需要在方法 [...] 抛出子句中声明

首先,我会让你的工厂有静态创建。 然后在水果的创建执行项实例中,创建水果线程。 否则,如果蔬菜的项目实例,则做蔬菜线。

相关内容

  • 没有找到相关文章

最新更新