Selaa lähdekoodia

factory method design pattern

檀烈 2 kuukautta sitten
vanhempi
säilyke
095bfcf37e

+ 12 - 0
src/main/java/cn/qinys/learn/creational/factory/ConcreteCreatorA.java

@@ -0,0 +1,12 @@
+package cn.qinys.learn.creational.factory;
+
+/**
+ * 具体创建者 A,创建 ConcreteProductA
+ */
+public class ConcreteCreatorA extends Creator {
+    @Override
+    public Product factoryMethod() {
+        return new ConcreteProductA();
+    }
+}
+

+ 12 - 0
src/main/java/cn/qinys/learn/creational/factory/ConcreteCreatorB.java

@@ -0,0 +1,12 @@
+package cn.qinys.learn.creational.factory;
+
+/**
+ * 具体创建者 B,创建 ConcreteProductB
+ */
+public class ConcreteCreatorB extends Creator {
+    @Override
+    public Product factoryMethod() {
+        return new ConcreteProductB();
+    }
+}
+

+ 17 - 0
src/main/java/cn/qinys/learn/creational/factory/ConcreteProductA.java

@@ -0,0 +1,17 @@
+package cn.qinys.learn.creational.factory;
+
+/**
+ * 具体产品 A
+ */
+public class ConcreteProductA implements Product {
+    @Override
+    public String getName() {
+        return "ConcreteProductA";
+    }
+
+    @Override
+    public void use() {
+        System.out.println("Using ConcreteProductA");
+    }
+}
+

+ 17 - 0
src/main/java/cn/qinys/learn/creational/factory/ConcreteProductB.java

@@ -0,0 +1,17 @@
+package cn.qinys.learn.creational.factory;
+
+/**
+ * 具体产品 B
+ */
+public class ConcreteProductB implements Product {
+    @Override
+    public String getName() {
+        return "ConcreteProductB";
+    }
+
+    @Override
+    public void use() {
+        System.out.println("Using ConcreteProductB");
+    }
+}
+

+ 21 - 0
src/main/java/cn/qinys/learn/creational/factory/Creator.java

@@ -0,0 +1,21 @@
+package cn.qinys.learn.creational.factory;
+
+/**
+ * Creator 抽象创建者 - 工厂方法模式的核心
+ */
+public abstract class Creator {
+    /**
+     * 工厂方法,子类决定返回哪种产品
+     */
+    public abstract Product factoryMethod();
+
+    /**
+     * 示范一个使用工厂方法创建并使用产品的模板方法
+     */
+    public void operation() {
+        Product product = factoryMethod();
+        System.out.println("Creator created: " + product.getName());
+        product.use();
+    }
+}
+

+ 16 - 0
src/main/java/cn/qinys/learn/creational/factory/FactoryDemo.java

@@ -0,0 +1,16 @@
+package cn.qinys.learn.creational.factory;
+
+/**
+ * 简单演示工厂方法模式的运行
+ */
+public class FactoryDemo {
+    public static void main(String[] args) {
+        Creator creatorA = new ConcreteCreatorA();
+        Creator creatorB = new ConcreteCreatorB();
+
+        System.out.println("Demo: Factory Method Pattern");
+        creatorA.operation();
+        creatorB.operation();
+    }
+}
+

+ 17 - 0
src/main/java/cn/qinys/learn/creational/factory/Product.java

@@ -0,0 +1,17 @@
+package cn.qinys.learn.creational.factory;
+
+/**
+ * Product 抽象产品接口
+ */
+public interface Product {
+    /**
+     * 返回产品名称,用于演示
+     */
+    String getName();
+
+    /**
+     * 使用产品的行为示例
+     */
+    void use();
+}
+

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

@@ -0,0 +1,21 @@
+package cn.qinys.learn.creational.factory;
+
+import org.junit.jupiter.api.Test;
+
+import static org.junit.jupiter.api.Assertions.assertEquals;
+
+public class FactoryTest {
+
+    @Test
+    public void testConcreteCreatorsProduceExpectedProducts() {
+        Creator a = new ConcreteCreatorA();
+        Creator b = new ConcreteCreatorB();
+
+        Product pa = a.factoryMethod();
+        Product pb = b.factoryMethod();
+
+        assertEquals("ConcreteProductA", pa.getName());
+        assertEquals("ConcreteProductB", pb.getName());
+    }
+}
+