diff --git a/core/lib/Drupal/Component/Plugin/PluginBase.php b/core/lib/Drupal/Component/Plugin/PluginBase.php
index 58c5a3b..086844b 100644
--- a/core/lib/Drupal/Component/Plugin/PluginBase.php
+++ b/core/lib/Drupal/Component/Plugin/PluginBase.php
@@ -7,6 +7,7 @@
 namespace Drupal\Component\Plugin;
 
 use Drupal\Component\Plugin\Discovery\DiscoveryInterface;
+use Symfony\Component\DependencyInjection\Container;
 
 /**
  * Base class for plugins wishing to support metadata inspection.
@@ -52,6 +53,26 @@ public function __construct(array $configuration, $plugin_id, DiscoveryInterface
   }
 
   /**
+   * Creates an instance of the plugin.
+   *
+   * @param \Symfony\Component\DependencyInjection\Container $container
+   *   The container to pull out services used in the plugin.
+   * @param array $configuration
+   *   A configuration array containing information about the plugin instance.
+   * @param string $plugin_id
+   *   The plugin_id for the plugin instance.
+   * @param DiscoveryInterface $discovery
+   *   The Discovery class that holds access to the plugin implementation
+   *   definition.
+   *
+   * @return static
+   *   Returns an instance of this plugin.
+   */
+  public static function create(Container $container, array $configuration, $plugin_id, DiscoveryInterface $discovery) {
+    return new static($configuration, $plugin_id, $discovery);
+  }
+
+  /**
    * Implements Drupal\Component\Plugin\PluginInterface::getPluginId().
    */
   public function getPluginId() {
diff --git a/core/lib/Drupal/Core/Plugin/Factory/MethodFactory.php b/core/lib/Drupal/Core/Plugin/Factory/MethodFactory.php
new file mode 100644
index 0000000..70315ea
--- /dev/null
+++ b/core/lib/Drupal/Core/Plugin/Factory/MethodFactory.php
@@ -0,0 +1,24 @@
+<?php
+/**
+ * @file
+ * Contains \Drupal\Core\Plugin\Factory\MethodFactory.
+ */
+
+namespace Drupal\Core\Plugin\Factory;
+
+use Drupal\Component\Plugin\Factory\DefaultFactory;
+
+/**
+ * Plugin factory to use a factory method.
+ */
+class MethodFactory extends DefaultFactory {
+
+  /**
+   * Overrides \Drupal\Component\Plugin\Factory\DefaultFactory::createInstance().
+   */
+  public function createInstance($plugin_id, array $configuration) {
+    $plugin_class = static::getPluginClass($plugin_id, $this->discovery);
+    return $plugin_class::create(drupal_container(), $configuration, $plugin_id, $this->discovery);
+  }
+
+}
diff --git a/core/modules/views/lib/Drupal/views/Plugin/ViewsPluginManager.php b/core/modules/views/lib/Drupal/views/Plugin/ViewsPluginManager.php
index 56633f8..1c6b8ae 100644
--- a/core/modules/views/lib/Drupal/views/Plugin/ViewsPluginManager.php
+++ b/core/modules/views/lib/Drupal/views/Plugin/ViewsPluginManager.php
@@ -14,6 +14,7 @@
 use Drupal\Core\Plugin\Discovery\AlterDecorator;
 use Drupal\Core\Plugin\Discovery\AnnotatedClassDiscovery;
 use Drupal\Core\Plugin\Discovery\CacheDecorator;
+use Drupal\Core\Plugin\Factory\MethodFactory;
 
 /**
  * Plugin type manager for all views plugins.
@@ -35,7 +36,7 @@ public function __construct($type, array $namespaces = array()) {
     $this->discovery = new AlterDecorator($this->discovery, 'views_plugins_' . $type);
     $this->discovery = new CacheDecorator($this->discovery, 'views:' . $type, 'views_info');
 
-    $this->factory = new DefaultFactory($this->discovery);
+    $this->factory = new MethodFactory($this->discovery);
 
     $this->defaults += array(
       'parent' => 'parent',
