diff --git a/spring-core-3/src/main/java/com/baeldung/factorymethod/Bar.java b/spring-core-3/src/main/java/com/baeldung/factorymethod/Bar.java
new file mode 100644
index 0000000000..22ef5b3429
--- /dev/null
+++ b/spring-core-3/src/main/java/com/baeldung/factorymethod/Bar.java
@@ -0,0 +1,18 @@
+package com.baeldung.factorymethod;
+
+public class Bar {
+
+ private String name;
+
+ public Bar(String name) {
+ this.name = name;
+ }
+
+ public String getName() {
+ return name;
+ }
+
+ public void setName(String name) {
+ this.name = name;
+ }
+}
diff --git a/spring-core-3/src/main/java/com/baeldung/factorymethod/Foo.java b/spring-core-3/src/main/java/com/baeldung/factorymethod/Foo.java
new file mode 100644
index 0000000000..54bd0c9ff4
--- /dev/null
+++ b/spring-core-3/src/main/java/com/baeldung/factorymethod/Foo.java
@@ -0,0 +1,5 @@
+package com.baeldung.factorymethod;
+
+public class Foo {
+
+}
diff --git a/spring-core-3/src/main/java/com/baeldung/factorymethod/InstanceBarFactory.java b/spring-core-3/src/main/java/com/baeldung/factorymethod/InstanceBarFactory.java
new file mode 100644
index 0000000000..f834b82aee
--- /dev/null
+++ b/spring-core-3/src/main/java/com/baeldung/factorymethod/InstanceBarFactory.java
@@ -0,0 +1,8 @@
+package com.baeldung.factorymethod;
+
+public class InstanceBarFactory {
+
+ public Bar createInstance(String name) {
+ return new Bar(name);
+ }
+}
diff --git a/spring-core-3/src/main/java/com/baeldung/factorymethod/InstanceFooFactory.java b/spring-core-3/src/main/java/com/baeldung/factorymethod/InstanceFooFactory.java
new file mode 100644
index 0000000000..c3125d3339
--- /dev/null
+++ b/spring-core-3/src/main/java/com/baeldung/factorymethod/InstanceFooFactory.java
@@ -0,0 +1,8 @@
+package com.baeldung.factorymethod;
+
+public class InstanceFooFactory {
+
+ public Foo createInstance() {
+ return new Foo();
+ }
+}
diff --git a/spring-core-3/src/main/java/com/baeldung/factorymethod/SingletonBarFactory.java b/spring-core-3/src/main/java/com/baeldung/factorymethod/SingletonBarFactory.java
new file mode 100644
index 0000000000..93802819b1
--- /dev/null
+++ b/spring-core-3/src/main/java/com/baeldung/factorymethod/SingletonBarFactory.java
@@ -0,0 +1,11 @@
+package com.baeldung.factorymethod;
+
+public class SingletonBarFactory {
+
+ private static final Bar INSTANCE = new Bar("unnamed");
+
+ public static Bar createInstance(String name) {
+ INSTANCE.setName(name);
+ return INSTANCE;
+ }
+}
diff --git a/spring-core-3/src/main/java/com/baeldung/factorymethod/SingletonFooFactory.java b/spring-core-3/src/main/java/com/baeldung/factorymethod/SingletonFooFactory.java
new file mode 100644
index 0000000000..77d56cc7f6
--- /dev/null
+++ b/spring-core-3/src/main/java/com/baeldung/factorymethod/SingletonFooFactory.java
@@ -0,0 +1,10 @@
+package com.baeldung.factorymethod;
+
+public class SingletonFooFactory {
+
+ private static final Foo INSTANCE = new Foo();
+
+ public static Foo createInstance() {
+ return INSTANCE;
+ }
+}
diff --git a/spring-core-3/src/test/java/com/baeldung/factorymethod/InstanceBarFactoryIntegrationTest.java b/spring-core-3/src/test/java/com/baeldung/factorymethod/InstanceBarFactoryIntegrationTest.java
new file mode 100644
index 0000000000..b5728316e7
--- /dev/null
+++ b/spring-core-3/src/test/java/com/baeldung/factorymethod/InstanceBarFactoryIntegrationTest.java
@@ -0,0 +1,24 @@
+package com.baeldung.factorymethod;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertNotNull;
+
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.test.context.ContextConfiguration;
+import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
+
+@RunWith(SpringJUnit4ClassRunner.class)
+@ContextConfiguration("/factorymethod/instance-bar-config.xml")
+public class InstanceBarFactoryIntegrationTest {
+
+ @Autowired
+ private Bar instance;
+
+ @Test
+ public void givenValidInstanceFactoryConfig_whenCreateInstance_thenNameIsCorrect() {
+ assertNotNull(instance);
+ assertEquals("someName", instance.getName());
+ }
+}
diff --git a/spring-core-3/src/test/java/com/baeldung/factorymethod/InstanceFooFactoryIntegrationTest.java b/spring-core-3/src/test/java/com/baeldung/factorymethod/InstanceFooFactoryIntegrationTest.java
new file mode 100644
index 0000000000..6b1857c2f2
--- /dev/null
+++ b/spring-core-3/src/test/java/com/baeldung/factorymethod/InstanceFooFactoryIntegrationTest.java
@@ -0,0 +1,22 @@
+package com.baeldung.factorymethod;
+
+import static org.junit.Assert.assertNotNull;
+
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.test.context.ContextConfiguration;
+import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
+
+@RunWith(SpringJUnit4ClassRunner.class)
+@ContextConfiguration("/factorymethod/instance-foo-config.xml")
+public class InstanceFooFactoryIntegrationTest {
+
+ @Autowired
+ private Foo foo;
+
+ @Test
+ public void givenValidInstanceFactoryConfig_whenCreateFooInstance_thenInstanceIsNotNull() {
+ assertNotNull(foo);
+ }
+}
diff --git a/spring-core-3/src/test/java/com/baeldung/factorymethod/SingletonBarFactoryIntegrationTest.java b/spring-core-3/src/test/java/com/baeldung/factorymethod/SingletonBarFactoryIntegrationTest.java
new file mode 100644
index 0000000000..403b46156b
--- /dev/null
+++ b/spring-core-3/src/test/java/com/baeldung/factorymethod/SingletonBarFactoryIntegrationTest.java
@@ -0,0 +1,24 @@
+package com.baeldung.factorymethod;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertNotNull;
+
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.test.context.ContextConfiguration;
+import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
+
+@RunWith(SpringJUnit4ClassRunner.class)
+@ContextConfiguration("/factorymethod/static-bar-config.xml")
+public class SingletonBarFactoryIntegrationTest {
+
+ @Autowired
+ private Bar instance;
+
+ @Test
+ public void givenValidStaticFactoryConfig_whenCreateInstance_thenNameIsCorrect() {
+ assertNotNull(instance);
+ assertEquals("someName", instance.getName());
+ }
+}
diff --git a/spring-core-3/src/test/java/com/baeldung/factorymethod/SingletonFooFactoryIntegrationTest.java b/spring-core-3/src/test/java/com/baeldung/factorymethod/SingletonFooFactoryIntegrationTest.java
new file mode 100644
index 0000000000..52154b81ab
--- /dev/null
+++ b/spring-core-3/src/test/java/com/baeldung/factorymethod/SingletonFooFactoryIntegrationTest.java
@@ -0,0 +1,22 @@
+package com.baeldung.factorymethod;
+
+import static org.junit.Assert.assertNotNull;
+
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.test.context.ContextConfiguration;
+import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
+
+@RunWith(SpringJUnit4ClassRunner.class)
+@ContextConfiguration("/factorymethod/static-foo-config.xml")
+public class SingletonFooFactoryIntegrationTest {
+
+ @Autowired
+ private Foo singleton;
+
+ @Test
+ public void givenValidStaticFactoryConfig_whenCreateInstance_thenInstanceIsNotNull() {
+ assertNotNull(singleton);
+ }
+}
diff --git a/spring-core-3/src/test/resources/factorymethod/instance-bar-config.xml b/spring-core-3/src/test/resources/factorymethod/instance-bar-config.xml
new file mode 100644
index 0000000000..40d2f33683
--- /dev/null
+++ b/spring-core-3/src/test/resources/factorymethod/instance-bar-config.xml
@@ -0,0 +1,20 @@
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/spring-core-3/src/test/resources/factorymethod/instance-foo-config.xml b/spring-core-3/src/test/resources/factorymethod/instance-foo-config.xml
new file mode 100644
index 0000000000..c45bef6a85
--- /dev/null
+++ b/spring-core-3/src/test/resources/factorymethod/instance-foo-config.xml
@@ -0,0 +1,18 @@
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/spring-core-3/src/test/resources/factorymethod/static-bar-config.xml b/spring-core-3/src/test/resources/factorymethod/static-bar-config.xml
new file mode 100644
index 0000000000..4d1befc645
--- /dev/null
+++ b/spring-core-3/src/test/resources/factorymethod/static-bar-config.xml
@@ -0,0 +1,20 @@
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/spring-core-3/src/test/resources/factorymethod/static-foo-config.xml b/spring-core-3/src/test/resources/factorymethod/static-foo-config.xml
new file mode 100644
index 0000000000..83e61a656c
--- /dev/null
+++ b/spring-core-3/src/test/resources/factorymethod/static-foo-config.xml
@@ -0,0 +1,18 @@
+
+
+
+
+
+
\ No newline at end of file