一. 前言 1. 定义 SimpleFactoryPattern:简单工厂模式又叫做静态工厂方法模式(因为工厂类定义了一个静态方法),定义一个用于创建对象的接口,让子类决定实例化哪个类。
Factory Method:工厂方法模式,又称工厂模式、多态工厂模式和虚拟构造器模式,通过定义工厂父类负责定义创建对象的公共接口,而子类则负责生成具体的对象。将类的实例化(具体产品的创建)延迟到工厂类的子类(具体工厂)中完成,即由子类来决定应该实例化(创建)哪一个类。
Abstract Factory:抽象工厂模式,即Abstract Factory Pattern,提供一个创建一系列相关或相互依赖对象的接口,而无须指定它们具体的类;具体的工厂负责实现具体的产品实例。抽象工厂模式与工厂方法模式最大的区别:抽象工厂中每个工厂可以创建多种类的产品;而工厂方法每个工厂只能创建一类。允许使用抽象的接口来创建一组相关产品,而不需要知道或关心实际生产出的具体产品是什么,这样就可以从具体产品中被解耦。
二. 简单工厂模式 1. 概况 背景:一个工厂生产多种产品。
2. 代码 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 public class SimpleFactoryPattern { public interface Product { void show () ; } public static class ProductA implements Product { @Override public void show () { System.out.println("Product A" ); } } public static class ProductB implements Product { @Override public void show () { System.out.println("Product B" ); } } public static class ProductFactory { public static Product createProduct (String type) { Product product = null ; switch (type){ case "A" : product = new ProductA(); break ; case "B" : product = new ProductB(); break ; } return product; } } public static void main (String[] args) { ProductFactory.createProduct("A" ).show(); ProductFactory.createProduct("B" ).show(); try { ProductFactory.createProduct("C" ).show(); }catch (NullPointerException e) { System.out.println("没有 Product C" ); } } }
1 2 3 4 Product A Product B 没有 Product C
3. 优点 代码解耦,创建实例的工作与使用实例的工作分开,使用者不必关心类对象如何创建。
4. 缺点
违背开放封闭原则,若需添加新产品则必须修改工厂类逻辑,会造成工厂逻辑过于复杂。
简单工厂模式使用了静态工厂方法,因此静态方法不能被继承和重写。
工厂类包含了所有实例(产品)的创建逻辑,若工厂类出错,则会造成整个系统都会会受到影响。
5. 应用场景 生成复杂对象时,确定只有一个工厂类,可以使用简单工厂模式。否则有多个工厂类的话,使用工厂方法模式。
三. 工厂方法模式 1. 概况 背景:有多个工厂,每个工厂只生产一种产品。
2. 代码 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 public class FactoryMethodPattern { public interface Product { void show () ; } public static class ProductA implements Product { @Override public void show () { System.out.println("Product A" ); } } public static class ProductB implements Product { @Override public void show () { System.out.println("Product B" ); } } public static abstract class ProductFactory { public abstract Product createProduct () ; } public static class ProductFactoryA extends ProductFactory { @Override public Product createProduct () { return new ProductA(); } } public static class ProductFactoryB extends ProductFactory { @Override public Product createProduct () { return new ProductB(); } } public static void main (String[] args) { new ProductFactoryA().createProduct().show(); new ProductFactoryB().createProduct().show(); } }
3. Android系统中的使用 Android中的ThreadFactory就是使用了工厂方法模式来生成线程的,线程就是ThreadFactory的产品。
4. 优点
符合 开放封闭原则 。新增产品时,只需增加相应的具体产品类和相应的工厂子类即可。
符合 单一职责原则 。每个具体工厂类只负责创建对应的产品。
5. 缺点
一个具体工厂只能创建一种具体产品。
增加新产品时,还需增加相应的工厂类,系统类的个数将成对增加,增加了系统的复杂度和性能开销。
引入的抽象类也会导致类结构的复杂化。
6. 应用场景 生成复杂对象时,无需知道具体类名,只需知道相应的工厂方法即可。
四. 抽象工厂模式 1. 概况 背景:有多个工厂,每个工厂生产多种产品。
2. 代码 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 public class AbstractFactoryPattern { public interface CPU { void showCPU () ; } public interface Memory { void showMemory () ; } public interface HD { void showHD () ; } public static class IntelCPU implements CPU { @Override public void showCPU () { System.out.println("Intel CPU" ); } } public static class AmdCPU implements CPU { @Override public void showCPU () { System.out.println("AMD CPU" ); } } public static class SanXinMemory implements Memory { @Override public void showMemory () { System.out.println("三星 Memory" ); } } public static class KingstonMemory implements Memory { @Override public void showMemory () { System.out.println("金士顿 Memory" ); } } public static class XiJieHD implements HD { @Override public void showHD () { System.out.println("希捷 硬盘" ); } } public static class XiBuHD implements HD { @Override public void showHD () { System.out.println("西部数据 硬盘" ); } } public static abstract class ComputerFactory { public abstract CPU createCPU () ; public abstract Memory createMemory () ; public abstract HD createHD () ; } public static class AppleFactory extends ComputerFactory { @Override public CPU createCPU () { return new IntelCPU(); } @Override public Memory createMemory () { return new SanXinMemory(); } @Override public HD createHD () { return new XiBuHD(); } } public static class LianXianFactory extends ComputerFactory { @Override public CPU createCPU () { return new AmdCPU(); } @Override public Memory createMemory () { return new KingstonMemory(); } @Override public HD createHD () { return new XiJieHD(); } } public static void main (String[] args) { System.out.println("--------------------生产苹果电脑-----------------------" ); AppleFactory appleFactory = new AppleFactory(); appleFactory.createCPU().showCPU(); appleFactory.createMemory().showMemory(); appleFactory.createHD().showHD(); System.out.println("--------------------生产联想电脑-----------------------" ); LianXianFactory lianXianFactory = new LianXianFactory(); lianXianFactory.createCPU().showCPU(); lianXianFactory.createMemory().showMemory(); lianXianFactory.createHD().showHD(); } }
1 2 3 4 5 6 7 8 9 --------------------生产苹果电脑----------------------- Intel CPU 三星 Memory 西部数据 硬盘 --------------------生产联想电脑----------------------- AMD CPU 金士顿 Memory 希捷 硬盘
3. 优点 代码解耦,创建实例的工作与使用实例的工作分开,使用者不必关心类对象如何创建。
4. 缺点 如果增加新的产品,则修改抽象工厂和所有的具体工厂,违反了 开放封闭原则。
5. 应用场景 生产多个产品组合的对象时。
参考文章 Android的设计模式-简单工厂模式
简单工厂模式(SimpleFactoryPattern)- 最易懂的设计模式解析
Android的设计模式-工厂方法模式
工厂方法模式(Factory Method)- 最易懂的设计模式解析
Android的设计模式-抽象工厂模式
抽象工厂模式(Abstract Factory)- 最易懂的设计模式解析