diff --git a/core/api/src/main/java/org/onosproject/net/newresource/ContinuousFactory.java b/core/api/src/main/java/org/onosproject/net/newresource/ContinuousFactory.java
new file mode 100644
index 0000000..2acd726
--- /dev/null
+++ b/core/api/src/main/java/org/onosproject/net/newresource/ContinuousFactory.java
@@ -0,0 +1,55 @@
+/*
+ * Copyright 2016 Open Networking Laboratory
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.onosproject.net.newresource;
+
+import com.google.common.annotations.Beta;
+
+/**
+ * Factory class for continuous-type resource related instances.
+ */
+@Beta
+public final class ContinuousFactory {
+    private final ContinuousResourceId id;
+
+    /**
+     * Creates an instance with the specified resource ID.
+     *
+     * @param id resource ID that is associated with the resource related instances
+     *           which will be created from this instance
+     */
+    ContinuousFactory(ContinuousResourceId id) {
+        this.id = id;
+    }
+
+    /**
+     * Returns the resource ID for continuous-type.
+     *
+     * @return continuous-type resource ID
+     */
+    public ContinuousResourceId id() {
+        return id;
+    }
+
+    /**
+     * Returns the resource for continuous-type specified by the given value.
+     *
+     * @param volume volume of the returned resource
+     * @return continuous-type resource
+     */
+    public ContinuousResource resource(double volume) {
+        return new ContinuousResource(id(), volume);
+    }
+}
diff --git a/core/api/src/main/java/org/onosproject/net/newresource/ContinuousResource.java b/core/api/src/main/java/org/onosproject/net/newresource/ContinuousResource.java
index af34bc5..f5301f7 100644
--- a/core/api/src/main/java/org/onosproject/net/newresource/ContinuousResource.java
+++ b/core/api/src/main/java/org/onosproject/net/newresource/ContinuousResource.java
@@ -98,7 +98,7 @@
 
     @Override
     public Optional<DiscreteResource> parent() {
-        return id.parent().map(DiscreteResource::new);
+        return id.parent().map(x -> Resource.discrete(x).resource());
     }
 
     @Override
diff --git a/core/api/src/main/java/org/onosproject/net/newresource/ContinuousResourceId.java b/core/api/src/main/java/org/onosproject/net/newresource/ContinuousResourceId.java
index 5870106..4dadacf 100644
--- a/core/api/src/main/java/org/onosproject/net/newresource/ContinuousResourceId.java
+++ b/core/api/src/main/java/org/onosproject/net/newresource/ContinuousResourceId.java
@@ -21,8 +21,6 @@
 import java.util.Objects;
 import java.util.Optional;
 
-import static com.google.common.base.Preconditions.checkNotNull;
-
 /**
  * ResourceId for {@link ContinuousResource}
  *
@@ -36,11 +34,6 @@
     // for printing purpose only (used in toString() implementation)
     private final String name;
 
-    ContinuousResourceId(ImmutableList<Object> components, String name) {
-        this.components = components;
-        this.name = checkNotNull(name);
-    }
-
     ContinuousResourceId(ImmutableList.Builder<Object> parentComponents, Class<?> last) {
         this.components = parentComponents.add(last.getCanonicalName()).build();
         this.name = last.getSimpleName();
diff --git a/core/api/src/main/java/org/onosproject/net/newresource/DiscreteFactory.java b/core/api/src/main/java/org/onosproject/net/newresource/DiscreteFactory.java
new file mode 100644
index 0000000..b285641
--- /dev/null
+++ b/core/api/src/main/java/org/onosproject/net/newresource/DiscreteFactory.java
@@ -0,0 +1,54 @@
+/*
+ * Copyright 2016 Open Networking Laboratory
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.onosproject.net.newresource;
+
+import com.google.common.annotations.Beta;
+
+/**
+ * Factory class for discrete-type resource related instances.
+ */
+@Beta
+public final class DiscreteFactory {
+    private final DiscreteResourceId id;
+
+    /**
+     * Create an instance with the specified resource ID.
+     *
+     * @param id resource ID that is associated with the resource related instances
+     *           which will be created from this instance
+     */
+    DiscreteFactory(DiscreteResourceId id) {
+        this.id = id;
+    }
+
+    /**
+     * Returns the resource ID for discrete-type.
+     *
+     * @return discrete-type resource ID
+     */
+    public DiscreteResourceId id() {
+        return id;
+    }
+
+    /**
+     * Returns the resource for discrete-type.
+     *
+     * @return discrete-type resource
+     */
+    public DiscreteResource resource() {
+        return new DiscreteResource(id);
+    }
+}
diff --git a/core/api/src/main/java/org/onosproject/net/newresource/DiscreteResource.java b/core/api/src/main/java/org/onosproject/net/newresource/DiscreteResource.java
index c8839a6..f1876d5 100644
--- a/core/api/src/main/java/org/onosproject/net/newresource/DiscreteResource.java
+++ b/core/api/src/main/java/org/onosproject/net/newresource/DiscreteResource.java
@@ -40,7 +40,7 @@
         this.id = id;
     }
 
-    protected DiscreteResource() {
+    DiscreteResource() {
         this.id = ResourceId.ROOT;
     }
 
@@ -80,17 +80,17 @@
     public DiscreteResource child(Object child) {
         checkArgument(!(child instanceof Class<?>));
 
-        return new DiscreteResource(id.child(child));
+        return Resource.discrete(id.child(child)).resource();
     }
 
     @Override
     public ContinuousResource child(Class<?> child, double value) {
-        return new ContinuousResource(id.child(child), value);
+        return Resource.continuous(id.child(child)).resource(value);
     }
 
     @Override
     public Optional<DiscreteResource> parent() {
-        return id.parent().map(DiscreteResource::new);
+        return id.parent().map(x -> Resource.discrete(x).resource());
     }
 
     @Override
diff --git a/core/api/src/main/java/org/onosproject/net/newresource/DiscreteResourceId.java b/core/api/src/main/java/org/onosproject/net/newresource/DiscreteResourceId.java
index 80c8f59..804dfba 100644
--- a/core/api/src/main/java/org/onosproject/net/newresource/DiscreteResourceId.java
+++ b/core/api/src/main/java/org/onosproject/net/newresource/DiscreteResourceId.java
@@ -50,17 +50,14 @@
     public DiscreteResourceId child(Object child) {
         checkArgument(!(child instanceof Class<?>));
 
-        return new DiscreteResourceId(ImmutableList.builder()
-                .addAll(components)
-                .add(child)
-                .build());
+        return Resource.discrete(this, child).id();
     }
 
     @Override
     public ContinuousResourceId child(Class<?> child) {
         checkNotNull(child);
 
-        return new ContinuousResourceId(ImmutableList.builder().addAll(components), child);
+        return Resource.continuous(this, child).id();
     }
 
     @Override
diff --git a/core/api/src/main/java/org/onosproject/net/newresource/Resource.java b/core/api/src/main/java/org/onosproject/net/newresource/Resource.java
index e3c5c47..749d87e 100644
--- a/core/api/src/main/java/org/onosproject/net/newresource/Resource.java
+++ b/core/api/src/main/java/org/onosproject/net/newresource/Resource.java
@@ -16,14 +16,16 @@
 package org.onosproject.net.newresource;
 
 import com.google.common.annotations.Beta;
-
+import com.google.common.collect.ImmutableList;
 import org.onosproject.net.DeviceId;
 import org.onosproject.net.PortNumber;
 
+import java.util.Arrays;
 import java.util.List;
 import java.util.Optional;
 
 import static com.google.common.base.Preconditions.checkArgument;
+import static com.google.common.base.Preconditions.checkNotNull;
 
 /**
  * An object that represent a resource in a network.
@@ -46,65 +48,6 @@
 
     DiscreteResource ROOT = new DiscreteResource();
 
-    static DiscreteResource discrete(DeviceId device) {
-        return new DiscreteResource(ResourceId.discrete(device));
-    }
-
-    /**
-     * Creates an resource path which represents a discrete-type resource from the specified components.
-     *
-     * @param device device ID which is the first component of the path
-     * @param components following components of the path. The order represents hierarchical structure of the resource.
-     * @return resource path instance
-     */
-    static DiscreteResource discrete(DeviceId device, Object... components) {
-        return new DiscreteResource(ResourceId.discrete(device, components));
-    }
-
-    /**
-     * Creates an resource path which represents a discrete-type resource from the specified components.
-     *
-     * @param device device ID which is the first component of the path
-     * @param port port number which is the second component of the path
-     * @param components following components of the path. The order represents hierarchical structure of the resource.
-     * @return resource path instance
-     */
-    static DiscreteResource discrete(DeviceId device, PortNumber port, Object... components) {
-        return new DiscreteResource(ResourceId.discrete(device, port, components));
-    }
-
-    /**
-     * Creates an resource path which represents a continuous-type resource from the specified components.
-     *
-     * @param value amount of the resource
-     * @param device device ID which is the first component of the path
-     * @param components following components of the path. The order represents hierarchical structure of the resource.
-     *                   The last element of this list must be an {@link Class} instance. Otherwise, this method throws
-     *                   an IllegalArgumentException.
-     * @return resource path instance
-     */
-    static ContinuousResource continuous(double value, DeviceId device, Object... components) {
-        checkArgument(components.length > 0,
-                "Length of components must be greater thant 0, but " + components.length);
-
-        return new ContinuousResource(ResourceId.continuous(device, components), value);
-    }
-
-    /**
-     * Creates an resource path which represents a continuous-type resource from the specified components.
-     *
-     * @param value amount of the resource
-     * @param device device ID which is the first component of the path.
-     * @param port port number which is the second component of the path.
-     * @param components following components of the path. The order represents hierarchical structure of the resource.
-     *                   The last element of this list must be an {@link Class} instance. Otherwise, this method throws
-     *                   an IllegalArgumentException.
-     * @return resource path instance
-     */
-    static ContinuousResource continuous(double value, DeviceId device, PortNumber port, Object... components) {
-        return new ContinuousResource(ResourceId.continuous(device, port, components), value);
-    }
-
     /**
      * Returns the components of this resource path.
      *
@@ -163,4 +106,189 @@
      * @return the ID of this resource path
      */
     ResourceId id();
+
+    /**
+     * Create a factory for discrete-type with the specified resource ID.
+     *
+     * @param id resource ID
+     * @return {@link DiscreteFactory}
+     */
+    static DiscreteFactory discrete(DiscreteResourceId id) {
+        checkNotNull(id);
+
+        return new DiscreteFactory(id);
+    }
+
+    /**
+     * Creates a factory for discrete-type with the specified parent ID and child.
+     *
+     * @param parent ID of the parent
+     * @param child child
+     * @return {@link DiscreteFactory}
+     */
+    static DiscreteFactory discrete(DiscreteResourceId parent, Object child) {
+        checkNotNull(parent);
+        checkNotNull(child);
+        checkArgument(!(child instanceof Class<?>));
+
+        return new DiscreteFactory(new DiscreteResourceId(ImmutableList.builder()
+                .addAll(parent.components())
+                .add(child)
+                .build()));
+    }
+
+    /**
+     * Create a factory for discrete-type with the specified device ID.
+     *
+     * @param device device ID
+     * @return {@link DiscreteFactory}
+     */
+    static DiscreteFactory discrete(DeviceId device) {
+        checkNotNull(device);
+
+        return new DiscreteFactory(new DiscreteResourceId(ImmutableList.of(device)));
+    }
+
+    /**
+     * Create a factory for discrete-type with the specified device ID and components.
+     *
+     * @param device device ID
+     * @param components resource ID components other than the device ID
+     * @return {@link DiscreteFactory}
+     */
+    static DiscreteFactory discrete(DeviceId device, Object... components) {
+        checkNotNull(device);
+        checkNotNull(components);
+
+        return new DiscreteFactory(new DiscreteResourceId(ImmutableList.builder()
+                .add(device)
+                .add(components)
+                .build()));
+    }
+
+    /**
+     * Create a factory for discrete-type with the specified device ID, port number and components.
+     *
+     * @param device device ID
+     * @param port port number
+     * @param components resource ID components other than the device ID and port number
+     * @return {@link DiscreteFactory}
+     */
+    static DiscreteFactory discrete(DeviceId device, PortNumber port, Object... components) {
+        checkNotNull(device);
+        checkNotNull(port);
+        checkNotNull(components);
+
+        return new DiscreteFactory(new DiscreteResourceId(ImmutableList.builder()
+                .add(device)
+                .add(port)
+                .add(components)
+                .build()));
+    }
+
+    /**
+     * Create a factory for continuous-type with the specified resource ID.
+     *
+     * @param id resource ID
+     * @return {@link ContinuousFactory}
+     */
+    static ContinuousFactory continuous(ContinuousResourceId id) {
+        checkNotNull(id);
+
+        return new ContinuousFactory(id);
+    }
+
+    /**
+     * Creates a factory for continuous-type wit the specified parent ID and child.
+     *
+     * @param parent ID of the parent
+     * @param child child
+     * @return {@link ContinuousFactory}
+     */
+    static ContinuousFactory continuous(DiscreteResourceId parent, Class<?> child) {
+        checkNotNull(parent);
+        checkNotNull(child);
+
+        return new ContinuousFactory(new ContinuousResourceId(ImmutableList.builder()
+                .addAll(parent.components()), child));
+    }
+
+    /**
+     * Create a factory for continuous-type with the specified device ID and type.
+     *
+     * @param device device ID
+     * @param cls type of resource the returned factory will create
+     * @return {@link ContinuousFactory}
+     */
+    static ContinuousFactory continuous(DeviceId device, Class<?> cls) {
+        checkNotNull(device);
+        checkNotNull(cls);
+
+        return new ContinuousFactory(new ContinuousResourceId(ImmutableList.builder().add(device), cls));
+    }
+
+    /**
+     * Create a factory for continuous-type with the specified device ID and components.
+     * The last element of the components must be a {@link Class} instance. Otherwise,
+     * an {@link IllegalArgumentException} is thrown.
+     *
+     * @param device device ID
+     * @param components resource ID components other than the device ID.
+     * @return {@link ContinuousFactory}
+     */
+    static ContinuousFactory continuous(DeviceId device, Object... components) {
+        checkNotNull(device);
+        checkNotNull(components);
+        checkArgument(components.length > 1);
+
+        Object last = components[components.length - 1];
+        checkArgument(last instanceof Class<?>);
+
+        return new ContinuousFactory(new ContinuousResourceId(ImmutableList.builder()
+                .add(device)
+                .add(Arrays.copyOfRange(components, 0, components.length - 1)), (Class<?>) last));
+    }
+
+    /**
+     * Create a factory for continuous-type with the specified device ID, port number and type.
+     *
+     * @param device device ID
+     * @param port port number
+     * @param cls type of resource the returned factory will create
+     * @return {@link ContinuousFactory}
+     */
+    static ContinuousFactory continuous(DeviceId device, PortNumber port, Class<?> cls) {
+        checkNotNull(device);
+        checkNotNull(port);
+        checkNotNull(cls);
+
+        return new ContinuousFactory(new ContinuousResourceId(ImmutableList.builder()
+                .add(device)
+                .add(port), cls));
+    }
+
+    /**
+     * Create a factory for continuous-type with the specified device ID and components.
+     * The last element of the components must be a {@link Class} instance. Otherwise,
+     * an {@link IllegalArgumentException} is thrown.
+     *
+     * @param device device ID
+     * @param port port number
+     * @param components resource ID components other than the device ID and port number.
+     * @return {@link ContinuousFactory}
+     */
+    static ContinuousFactory continuous(DeviceId device, PortNumber port, Object... components) {
+        checkNotNull(device);
+        checkNotNull(port);
+        checkNotNull(components);
+        checkArgument(components.length > 1);
+
+        Object last = components[components.length - 1];
+        checkArgument(last instanceof Class<?>);
+
+        return new ContinuousFactory(new ContinuousResourceId(ImmutableList.builder()
+                .add(device)
+                .add(port)
+                .add(Arrays.copyOfRange(components, 0, components.length - 1)), (Class<?>) last));
+    }
 }
diff --git a/core/api/src/main/java/org/onosproject/net/newresource/ResourceId.java b/core/api/src/main/java/org/onosproject/net/newresource/ResourceId.java
index 6f785df..ee1660d 100644
--- a/core/api/src/main/java/org/onosproject/net/newresource/ResourceId.java
+++ b/core/api/src/main/java/org/onosproject/net/newresource/ResourceId.java
@@ -16,15 +16,9 @@
 package org.onosproject.net.newresource;
 
 import com.google.common.annotations.Beta;
-import com.google.common.collect.ImmutableList;
-import org.onosproject.net.DeviceId;
-import org.onosproject.net.PortNumber;
 
-import java.util.Arrays;
 import java.util.Optional;
 
-import static com.google.common.base.Preconditions.checkArgument;
-
 /**
  * Represents identifier of resource.
  * This class is exposed to public, but intended to use only in ResourceStore implementations.
@@ -33,40 +27,6 @@
 public abstract class ResourceId {
     static final DiscreteResourceId ROOT = new DiscreteResourceId();
 
-    static DiscreteResourceId discrete(DeviceId device, Object... components) {
-        return new DiscreteResourceId(ImmutableList.builder()
-                .add(device)
-                .add(components)
-                .build());
-    }
-
-    static DiscreteResourceId discrete(DeviceId device, PortNumber port, Object... components) {
-        return new DiscreteResourceId(ImmutableList.builder()
-                .add(device)
-                .add(port)
-                .add(components)
-                .build());
-    }
-
-    static ContinuousResourceId continuous(DeviceId device, Object... components) {
-        Object last = components[components.length - 1];
-        checkArgument(last instanceof Class<?>);
-
-        return new ContinuousResourceId(ImmutableList.builder()
-                .add(device)
-                .add(Arrays.copyOfRange(components, 0, components.length - 1)), (Class<?>) last);
-    }
-
-    static ContinuousResourceId continuous(DeviceId device, PortNumber port, Object... components) {
-        Object last = components[components.length - 1];
-        checkArgument(last instanceof Class<?>);
-
-        return new ContinuousResourceId(ImmutableList.builder()
-                .add(device)
-                .add(port)
-                .add(Arrays.copyOfRange(components, 0, components.length - 1)), (Class<?>) last);
-    }
-
     /**
      * Returns the parent resource ID of this instance.
      *
