工厂方法怎么返回接口和抽象类的实例?

原学程将引见工场办法若何前往交心以及笼统类的虚例?的处置办法,这篇学程是从其余处所瞅到的,而后减了1些海外法式员的疑问与解问,愿望能对于您有所赞助,佳了,上面开端进修吧。

工厂方法怎么返回接口和抽象类的实例? 教程 第1张

成绩描写

ExecutorService以及Service是交心,是以只要笼统办法,这意味着它们的办法出有完成。这么,我们怎样在交心典型的援用上浮用future.get()es.submit()以及es.shutdown()办法呢?比方,为何我们不妨做以下工作?

Future f = ...
f.get();

这里有1个更详细的例子:

import java.util.concurrent.*;
class Factorial implements Callable<Long> {
 long n;
 public Factorial(long n) {
  this.n = n;
 }

 public Long call() throws Exception {
  if (n <= 0) {
throw new Exception("for finding factorial, N should be > 0");
  }
  long fact = 一;
  for(long longVal = 一; longVal <= n; longVal++) {
fact *= longVal;
  }
  return fact;
 }
}

class CallableTest {
 public static void main(String []args) throws Exception {
  long N = 二0;

  Callable<Long> task = new Factorial(N);
  ExecutorService es = Executors.newSingleThreadExecutor();
  Future<Long> future = es.submit(task);

  System.out.printf("factorial of %d is %d", N, future.get());
  es.shutdown();
 }
}

推举谜底

这个成绩投了1些否决票,由于从某种意义上说,它是1种根本的成绩,但是我以为它现实上是1种风趣的成绩。究竟,像您的示例中的Executors如许的工场类不妨指定它前往Executors。然则,正如您所指出的,这只是1个交心,假如您要可以或许挪用这些办法,您现实上须要1个Executor的器械的虚例。为何工场不用告知我们退货的现实典型?

假如您之前出有睹过这1面,能够没有清晰您是怎样做到这1面的。须要忘住的主要1面是,假如您有1个完成交心的类,则申明为前往交心典型的办法也能够前往该类的虚例。也便是说,您不妨:

interface Foo { /* ... */ }

class Bar implements Foo { /* ... */ }

class Factory {
  Foo makeFoo() { 
 return new Bar( /*... */ );
  }
}

makeFoo被申明为前往Foo,但是Foo是1个交心;您不克不及现实具有它的虚例。您只能具有Foo的类的虚例。Bar完成了Foo,所以您不妨前往Bar的虚例。

之所以不妨如许做,是由于当挪用对于象上的办法时,该办法的完成不妨在我们援用的现实对于象中找到。查找办法的方法现实上有面庞杂。不外,从观点上道,您能够会如许想:假如您告知我您是Foo,这么我不妨请求您运转Foo中申明的所有办法,但是将决议为该办法做甚么。我只能应用您的Foo典型去肯定我不妨请求您履行哪些办法。这1面异常主要,这也是为何我们不妨重写子类中的办法。这些被称为virtual methods。这很主要的缘由之1是,它使我们可以或许应用交心,在这些交心中,我们不妨泄漏有闭完成的起码质信息(我们不妨选择说"我完成了Foo,但是这便是我告知您的闭于我本身的一切实质),但是依然遵照开同(即,我被包管现实完成Foo中申明的一切办法)。

上面的示例更深刻1些,而且捕捉了您在Executors中瞅到的更多工场形式。

代码

public class InterfacesExample {

 /**
  * An interface with one method.
  */
 interface Frobber {
  /**
* Frob the object.
* @param object the object
*/
  void frob( Object object );
 }

 /**
  * A factory class with one method for creating printing frobber.
  */
 public static class Frobbers {
  /**
* Returns a Frobber whose {@link Frobber#frob(Object)} method
* prints its argument
* @return a printing Frobber
*/
  public static Frobber newPrintingFrobber() {
// This returns an instance of an anonymous class
// that implements the Frobber interface.  It has 
// to provide an implementation of frob(Object),
// though.
return new Frobber() {
 @Override
 public void frob( final Object object ) {
  System.out.println( "Frobbing "+object+"..." );
 }
};
  }

  /**
* Returns a Frobber whose {@link Frobber#frob(Object)} method
* prints the prefix and its argument
* @param prefix an object
* @return a prefixing printing Frobber
*/
  public static Frobber newPrefixingPrintingFrobber( final Object prefix ) {
return new PrefixingPrintingFrobber( prefix );
  }

  /**
* A private, but not anonymous class.  Instances shouldn't be
* made with its constructor, but rather through the factory 
* method {@link Frobbers#newPrefixingPrintingFrobber(Object)}. 
*/
  private static class PrefixingPrintingFrobber implements Frobber {
final Object prefix;

public PrefixingPrintingFrobber( Object prefix ) { 
 this.prefix = prefix;
}

@Override
public void frob( final Object object ) {
 System.out.println( "Frobbing "+prefix+":"+object+"..." );
} 

  }
 }

 /**
  * Create some frobbers with the factory and test them out.
  */
 public static void main( final String[] args ) {
  final Frobber f一 = Frobbers.newPrintingFrobber();
  f一.frob( 四二 );

  final Frobber f二 = Frobbers.newPrefixingPrintingFrobber( "boing" );
  f二.frob( 三六 );
 }
}

输入

Frobbing 四二...
Frobbing boing:三六...

佳了闭于工场办法怎样前往交心以及笼统类的虚例?的学程便到这里便停止了,愿望趣模板源码网找到的这篇技巧文章能赞助到年夜野,更多技巧学程不妨在站内搜刮。