Java Factory pattern

  Factory大概是最简单的设计模式了,用了一些,也该理一理了。我们先看看它的模式模式图:

                     

   

  简单的说,工厂模式就是把“产品”与“产品生产”分离,然后对“产品”进行抽象。这样就形成了一个简单工厂模式。如果你再对“产品生产”这个环节进行抽象,那么就得到方法工厂模式。如果你在方法工厂模式里有多个产品足,那么就形成了抽象工厂。

  那就分别对以上三种举例吧:

  1.简单工厂

  

 1 //client
2 public class SimpleFactoryTest {
3 public static void main(String[] args) throws NoThisProduct {
4 Product productA = SimpleFactory.createProduct(SimpleFactory.PRODUCT_A);
5 Product productB = SimpleFactory.createProduct(SimpleFactory.PRODUCT_B);
6 productA.work();
7 productB.work();
8 }
9 }
10 //定义抽象产品
11 abstract class Product {
12 public abstract void work();
13 }
14 //具体产品A
15 class ProductA extends Product{
16 @Override
17 public void work() {
18 System.out.println("ProductA is working !");
19 }
20 }
21 //具体产品B
22 class ProductB extends Product{
23 @Override
24 public void work() {
25 System.out.println("ProductB is working !");
26 }
27 }
28 //定义一个异常,当找不到该类型产品时候抛出这个异常
29 class NoThisProduct extends Exception {
30 public NoThisProduct(String aName) {
31 super(aName);
32 }
33 }
34 //定义工厂类
35 class SimpleFactory{
36 public static final int PRODUCT_A = 0;
37 public static final int PRODUCT_B = 1;
38 public static Product createProduct(int type) throws NoThisProduct{
39 if(PRODUCT_A == type)
40 return new ProductA();
41 else if(PRODUCT_B == type)
42 return new ProductB();
43 else
44 throw new NoThisProduct("it has no this type :"+type+" product ...");
45 }
46 }

  2.方法工厂

 1 /**
2 * 简单工厂模式把所有的重心放到工厂类上,一旦向系统增加新的产品,就必须修改
3 * 工厂类,不满足开闭原则(对修改关闭,对扩展开放);工厂方法模式提供一个抽象
4 * 的工厂接口,在不同的产品结构上实现不同的产品工厂具体类来创建该层次中的产
5 * 品,通常一个具体工厂创建一个具体产品。在新增产品的时候,只需要实现新的对
6 * 应工厂就可以满足需要,是符合开闭原则的
7 */
8 //client
9 public class MethodFactoryTest {
10 public static void main(String[] args) {
11 Product productA = new FactoryA().createProduct();
12 Product productB = new FactoryB().createProduct();
13 productA.work();
14 productB.work();
15 }
16 }
17 //定义抽象产品
18 abstract class Product {
19 public abstract void work();
20 }
21 //具体产品A
22 class ProductA extends Product{
23 @Override
24 public void work() {
25 System.out.println("ProductA is working !");
26 }
27 }
28 //具体产品B
29 class ProductB extends Product{
30 @Override
31 public void work() {
32 System.out.println("ProductB is working !");
33 }
34 }
35
36 //定义工厂接口,产生产品的接口
37 abstract class Factory{
38 abstract Product createProduct();
39 }
40 //生常产品A的工厂
41 class FactoryA extends Factory{
42 @Override
43 Product createProduct() {
44 return new ProductA();
45 }
46 }
47 //生常产品B的工厂
48 class FactoryB extends Factory{
49 @Override
50 Product createProduct() {
51 return new ProductB();
52 }
53 }

  3.抽象工厂

 1 //client
2 public class AbstractFactoryTest {
3
4 public static void main(String[] args) {
5
6 }
7 }
8 //定义抽象产品A
9 abstract class ProductA {
10 public abstract void work();
11 }
12 //具体产品One
13 class ProductAOne extends ProductA{
14 @Override
15 public void work() {
16 System.out.println("ProductA is working !");
17 }
18 }
19 //具体产品Two
20 class ProductATwo extends ProductA{
21 @Override
22 public void work() {
23 System.out.println("ProductB is working !");
24 }
25 }
26
27 //定义抽象产品B
28 abstract class ProductB {
29 public abstract void work();
30 }
31 //具体产品One
32 class ProductBOne extends ProductB{
33 @Override
34 public void work() {
35 System.out.println("ProductA is working !");
36 }
37 }
38 //具体产品Two
39 class ProductBTwo extends ProductB{
40 @Override
41 public void work() {
42 System.out.println("ProductB is working !");
43 }
44 }
45
46 //定义工厂接口,产生产品的接口
47 abstract class Factory{
48 abstract ProductA createProductA();
49 abstract ProductB createProductB();
50 }
51 class FactoryA extends Factory{
52 @Override
53 public ProductA createProductA() {
54 return new ProductAOne();
55 }
56 @Override
57 public ProductB createProductB() {
58 return new ProductBOne();
59 }
60 }
61 class FactoryB extends Factory{
62 @Override
63 public ProductA createProductA() {
64 return new ProductATwo();
65 }
66 @Override
67 public ProductB createProductB() {
68 return new ProductBTwo();
69 }
70 }




原文地址:https://www.cnblogs.com/slider/p/2324689.html