diff --git a/lib/gitlab/view/presenter/factory.rb b/lib/gitlab/view/presenter/factory.rb
new file mode 100644
index 0000000000000000000000000000000000000000..92979c61a25d91f99fcc52348971603c1e3cd604
--- /dev/null
+++ b/lib/gitlab/view/presenter/factory.rb
@@ -0,0 +1,22 @@
+module Gitlab
+  module View
+    module Presenter
+      class Factory
+        def initialize(subject, **attributes)
+          @subject = subject
+          @attributes = attributes
+        end
+
+        def fabricate!
+          presenter_class.new(@subject, @attributes)
+        end
+
+        private
+
+        def presenter_class
+          @subject.class.const_get('Presenter')
+        end
+      end
+    end
+  end
+end
diff --git a/lib/gitlab/view/presenter_factory.rb b/lib/gitlab/view/presenter_factory.rb
deleted file mode 100644
index c8cab1249daa973a587d5c43ac64c91667bc647b..0000000000000000000000000000000000000000
--- a/lib/gitlab/view/presenter_factory.rb
+++ /dev/null
@@ -1,39 +0,0 @@
-module Gitlab
-  module View
-    class PresenterFactory
-      def initialize(subject, user: nil)
-        @subject = subject
-        @user = user
-      end
-
-      def fabricate!
-        presenter =
-          if presenter_class.ancestors.include?(SimpleDelegator)
-            delegator_presenter
-          else
-            simple_presenter
-          end
-
-        presenter
-          .with_subject(subject)
-          .with_user(user)
-      end
-
-      private
-
-      attr_reader :subject, :user
-
-      def presenter_class
-        "#{subject.class.name.demodulize}Presenter".constantize
-      end
-
-      def delegator_presenter
-        presenter_class.new(subject)
-      end
-
-      def simple_presenter
-        presenter_class.new
-      end
-    end
-  end
-end
diff --git a/spec/lib/gitlab/view/presenter/factory_spec.rb b/spec/lib/gitlab/view/presenter/factory_spec.rb
new file mode 100644
index 0000000000000000000000000000000000000000..7a65429b500c42d426bca5e6cdad09f99fd8f7a0
--- /dev/null
+++ b/spec/lib/gitlab/view/presenter/factory_spec.rb
@@ -0,0 +1,42 @@
+require 'spec_helper'
+
+describe Gitlab::View::Presenter::Factory do
+  let(:variable) { create(:ci_variable) }
+
+  describe '#initialize' do
+    context 'without optional parameters' do
+      subject do
+        described_class.new(variable)
+      end
+
+      it 'takes a subject and optional params' do
+        expect { subject }.not_to raise_error
+      end
+    end
+
+    context 'with optional parameters' do
+      subject do
+        described_class.new(variable, user: 'user')
+      end
+
+      it 'takes a subject and optional params' do
+        expect { subject }.not_to raise_error
+      end
+    end
+  end
+
+  describe '#fabricate!' do
+    subject do
+      described_class.new(variable, user: 'user', foo: 'bar').fabricate!
+    end
+
+    it 'exposes given params' do
+      expect(subject.user).to eq('user')
+      expect(subject.foo).to eq('bar')
+    end
+
+    it 'detects the presenter based on the given subject' do
+      expect(subject).to be_a(Ci::Variable::Presenter)
+    end
+  end
+end
diff --git a/spec/lib/gitlab/view/presenter_factory_spec.rb b/spec/lib/gitlab/view/presenter_factory_spec.rb
deleted file mode 100644
index c5e4d86f6c9ef0825269730084ec1869bb0f4a67..0000000000000000000000000000000000000000
--- a/spec/lib/gitlab/view/presenter_factory_spec.rb
+++ /dev/null
@@ -1,48 +0,0 @@
-require 'spec_helper'
-
-describe Gitlab::View::PresenterFactory do
-  let(:appearance) { build(:appearance) }
-  let(:broadcast_message) { build(:broadcast_message) }
-
-  before do
-    class AppearancePresenter
-      include Gitlab::View::Presenter
-    end
-
-    class BroadcastMessagePresenter < SimpleDelegator
-      include Gitlab::View::Presenter
-    end
-  end
-
-  describe '#initialize' do
-    subject do
-      described_class.new(appearance)
-    end
-
-    it 'takes a subject and optional params' do
-      expect { subject }.not_to raise_error
-    end
-  end
-
-  describe '#fabricate!' do
-    context 'without delegation' do
-      subject do
-        described_class.new(appearance).fabricate!
-      end
-
-      it 'does not forward missing methods to subject' do
-        expect { subject.title }.to raise_error(NoMethodError)
-      end
-    end
-
-    context 'with delegation' do
-      subject do
-        described_class.new(broadcast_message).fabricate!
-      end
-
-      it 'forwards missing methods to subject' do
-        expect(subject.message).to eq(broadcast_message.message)
-      end
-    end
-  end
-end