Ver código fonte

Add typical factory pattern example in creational.factory package and unit tests

檀烈 2 meses atrás
pai
commit
c6ddbab286

+ 2 - 5
src/main/java/cn/qinys/learn/creational/factory/Apple.java

@@ -1,11 +1,8 @@
 package cn.qinys.learn.creational.factory;
 
-/**
- * 具体产品B
- */
 public class Apple implements Fruit {
     @Override
-    public String name() {
-        return "apple";
+    public void grow() {
+        System.out.println("Apple is growing");
     }
 }

+ 2 - 5
src/main/java/cn/qinys/learn/creational/factory/Banana.java

@@ -1,11 +1,8 @@
 package cn.qinys.learn.creational.factory;
 
-/**
- * 具体产品A
- */
 public class Banana implements Fruit {
     @Override
-    public String name() {
-        return "banana";
+    public void grow() {
+        System.out.println("Banana is growing");
     }
 }

+ 1 - 5
src/main/java/cn/qinys/learn/creational/factory/Fruit.java

@@ -1,9 +1,5 @@
 package cn.qinys.learn.creational.factory;
 
-/**
- * 产品接口
- */
 public interface Fruit {
-
-    String name();
+    void grow();
 }

+ 8 - 10
src/main/java/cn/qinys/learn/creational/factory/FruitFactory.java

@@ -1,15 +1,13 @@
 package cn.qinys.learn.creational.factory;
 
-/**
- * 具体工厂A
- */
 public class FruitFactory {
-
-    public static Fruit createFruit(Class<? extends Fruit> c) {
-        try {
-            return c.getDeclaredConstructor().newInstance();
-        } catch (Exception e) {
-            throw new RuntimeException("Failed to create fruit instance", e);
+    public static Fruit createFruit(String type) {
+        if ("apple".equalsIgnoreCase(type)) {
+            return new Apple();
+        } else if ("banana".equalsIgnoreCase(type)) {
+            return new Banana();
+        } else {
+            throw new IllegalArgumentException("Unknown fruit type: " + type);
         }
     }
-}
+}

+ 1 - 1
src/main/java/cn/qinys/learn/creational/singleton/Singleton.java

@@ -6,7 +6,7 @@ package cn.qinys.learn.creational.singleton;
  */
 public class Singleton {
 
-    // Private static instance variable
+    // Private static instance variable 防止指令重排导致程序出错
     private static volatile Singleton instance;
 
     // Private constructor to prevent instantiation

+ 1 - 1
src/main/java/cn/qinys/learn/creational/singleton/Singleton2.java

@@ -7,7 +7,7 @@ package cn.qinys.learn.creational.singleton;
 public class Singleton2 {
 
     // Public static method to get the instance
-    // Private static instance variable
+    // Private static instance variable 不需要防止指令重排 volatile
 
     private static final Singleton2 instance = new Singleton2();
 

+ 0 - 9
src/test/java/cn/qinys/learn/creational/factory/FactoryTest.java

@@ -1,9 +0,0 @@
-package cn.qinys.learn.creational.factory;
-
-/**
- * 工厂模式单元测试
- */
-public class FactoryTest {
-
-
-}

+ 19 - 12
src/test/java/cn/qinys/learn/creational/factory/FruitFactoryTest.java

@@ -1,21 +1,28 @@
 package cn.qinys.learn.creational.factory;
 
 import org.junit.jupiter.api.Test;
+import static org.junit.jupiter.api.Assertions.*;
 
-import static org.junit.jupiter.api.Assertions.assertEquals;
-
-class FruitFactoryTest {
+public class FruitFactoryTest {
 
     @Test
-    void createFruit() {
-        Fruit apple = FruitFactory.createFruit(Apple.class);
-        assertEquals("apple", apple.name());
+    public void testCreateApple() {
+        Fruit fruit = FruitFactory.createFruit("apple");
+        assertTrue(fruit instanceof Apple);
+        fruit.grow(); // Should print "Apple is growing"
+    }
 
-        Fruit banana = FruitFactory.createFruit(Banana.class);
-        assertEquals("banana", banana.name());
+    @Test
+    public void testCreateBanana() {
+        Fruit fruit = FruitFactory.createFruit("banana");
+        assertTrue(fruit instanceof Banana);
+        fruit.grow(); // Should print "Banana is growing"
+    }
 
-//        assertThrows(IllegalArgumentException.class, () -> {
-//            FruitFactory.createFruit("orange");
-//        });
+    @Test
+    public void testCreateUnknownFruit() {
+        assertThrows(IllegalArgumentException.class, () -> {
+            FruitFactory.createFruit("orange");
+        });
     }
-}
+}