工厂模式包括以下几步:
    ①、使用一个接口规定工厂模式生产的类型(Game)。
    ②、使用一个接口规定工厂模式的工厂类型(GameFactory)。
    ③、按需使用多个类去实现工厂模式生产的类型(类Checkers、类Chess),同时在这些类中都必须持有工厂类的static引用,并且使用匿名内部类去实现(public static GameFactory factory = new GameFactory()…)。
    ④、一个类似框架的方法,专门与工厂类打交道(playGame(GameFactory factory))。
    ⑤、测试类(public class Game)。

    1. // 使用匿名内部类简化工厂模式
    2. //接口Game,实际上它规定了工厂生产什么类型
    3. interface Game{
    4. //方法move()
    5. boolean move();
    6. }
    7. //接口GameFactory,实际上它代表的是一个工厂专门生产某种类型,在这里是类型Game
    8. interface GameFactory{
    9. //方法getGame(),返回类型为Game,这是工厂的生产方法
    10. Game getGame();
    11. }
    12. //接下来按照给定的接口类型创建具体的类,再将它放入工厂中,以便工厂能生产出来。
    13. class Checkers implements Game{
    14. //统一由工厂模式生产,所以构造方法不对外开放.
    15. //private的构造方法
    16. private Checkers(){}
    17. //private的int类型的类变量moves,初始化值为0
    18. private int moves = 0;
    19. //private static final的int类型的类变量MOVES,
    20. //初始化值为3
    21. private static final int MOVES = 3;
    22. //重写方法move(),返回类型为boolean
    23. public boolean move(){ //ture继续进行,False
    24. //打印字符串"Checkers move" + moves
    25. System.out.println("Checkers move" + moves);
    26. //返回表达式++moves是否不等于MOVES
    27. //这里之所以是++moves是因为在调用方法move()的时候
    28. //需要变量move在原先的基础上自增1
    29. return ++moves != MOVES;
    30. }
    31. //static的GameFactory类型的类变量factory,
    32. //通过匿名内部类给它赋值了一个GameFactory的对象实例
    33. public static GameFactory factory = new GameFactory(){
    34. //实现方法getGame()
    35. public Game getGame(){
    36. //返回一个类Checkers的对象实例
    37. return new Checkers();
    38. }
    39. };
    40. }
    41. //接下来按照给定的接口类型创建具体的类,再将它放入工厂
    42. //中,以便工厂能生产出来。
    43. class Chess implements Game{
    44. //统一由工厂模式生产,所以构造方法不对外开放.
    45. //private的构造方法
    46. private Chess(){}
    47. //private的int类型的类变量moves,初始化值为0
    48. private int moves = 0;
    49. //private static final的int类型的类变量MOVES,
    50. //初始化值为3
    51. private static final int MOVES = 4;
    52. //重写方法move(),返回类型为boolean
    53. public boolean move(){
    54. //打印字符串"Chess move" + moves
    55. System.out.println("Chess move" + moves);
    56. //返回表达式++moves是否不等于MOVES
    57. //这里之所以是++moves是因为在调用方法move()的时候
    58. //需要变量move在原先的基础上自增1
    59. return ++moves != MOVES;
    60. }
    61. //static的GameFactory类型的类变量factory,
    62. //通过匿名内部类给它赋值了一个GameFactory的对象实例
    63. public static GameFactory factory = new GameFactory(){
    64. //实现方法getGame()
    65. public Game getGame(){
    66. //返回一个类Chess的对象实例
    67. return new Chess();
    68. }
    69. };
    70. }
    71. //测试类Game
    72. public class GameDemo{
    73. //类似框架的方法playGame(GameFactory factory),带一个
    74. //GameFactory类型的形式参数factory
    75. public static void playGame(GameFactory factory){
    76. //调用方法getGame()获得Game类型的对象实例
    77. Game s = factory.getGame();
    78. //while循环,因为s.move()得出的结果是boolean类型
    79. while(s.move()){
    80. //...
    81. }
    82. }
    83. //程序执行入口main方法
    84. public static void main(String[] args){
    85. //测试工厂模式生产类Checkers的对象
    86. playGame(Checkers.factory);
    87. //测试工厂模式生产类Chess的对象
    88. playGame(Chess.factory);
    89. }
    90. }
    1. // 匿名内部类优化工厂设计模式
    2. //接口Service
    3. interface Service{
    4. //方法method1()
    5. void method1();
    6. //方法method2()
    7. void method2();
    8. }
    9. //接口ServiceFactory,代表用来产生Service类型的工厂
    10. interface ServiceFactory{
    11. //方法getService(),返回类型为Service类型
    12. Service getService();
    13. }
    14. //类Implementation1实现接口Service
    15. class Implementation1 implements Service{
    16. //private的构造方法
    17. private Implementation1() {}
    18. //实现方法method1()
    19. public void method1(){
    20. //打印字符串"Implementation1 method1"
    21. System.out.println("Implementation1 method1");
    22. }
    23. //实现方法method2()
    24. public void method2(){
    25. //打印字符串"Implementation1 method2"
    26. System.out.println("Implementation1 method2");
    27. }
    28. //static修饰的ServiceFactory类型的类变量factory.
    29. //创建了一个ServiceFactory类型的匿名内部类复制给factory
    30. public static ServiceFactory factory = new
    31. ServiceFactory(){
    32. //实现了方法getService()
    33. public Service getService(){
    34. //实际返回的是类Implementation1的对象实例
    35. return new Implementation1();
    36. }
    37. };
    38. }
    39. //类Implementation2实现接口Service
    40. class Implementation2 implements Service{
    41. //private的构造方法
    42. private Implementation2() {}
    43. //实现方法method1()
    44. public void method1(){
    45. //打印字符串"Implementation2 method1"
    46. System.out.println("Implementation2 method1");
    47. }
    48. //实现方法method2()
    49. public void method2(){
    50. //打印字符串"Implementation2 method2"
    51. System.out.println("Implementation2 method2");
    52. }
    53. //static修饰的ServiceFactory类型的类变量factory.
    54. //创建了一个ServiceFactory类型的匿名内部类复制给factory
    55. public static ServiceFactory factory = new
    56. ServiceFactory(){
    57. //实现了方法getService()
    58. public Service getService(){
    59. //实际返回的是类Implementation2的对象实例
    60. return new Implementation2();
    61. }
    62. };
    63. }
    64. //测试类Factories
    65. public class Factories{
    66. //固定方法serviceConsumer(ServiceFactory fact),带一个
    67. //ServiceFactory类型的形式参数fact,实际上这就是一个类似
    68. //框架的方法,至于父接口打交道,但是实际传入的可以是它的子类对象
    69. public static void serviceConsumer(ServiceFactory fact){
    70. //调用方法(工厂方法)获得一个Service类型,赋值给
    71. //Service类型的变量s
    72. Service s = fact.getService();
    73. //调用方法method1()
    74. s.method1();
    75. //调用方法method2()
    76. s.method2();
    77. }
    78. //程序执行入口main方法
    79. public static void main(String[] args){
    80. //调用方法serviceConsumer(ServiceFactory fact),
    81. //实际传入的参数是Implementation1.factory,它返回
    82. //一个类Implementation1的对象实例。
    83. serviceConsumer(Implementation1.factory);
    84. //同上
    85. serviceConsumer(Implementation2.factory);
    86. }
    87. }

    在上面的代码示例中,类Implementation1和类Implementation2的构造方法都是private的,并且没有任何必要去创建作为工厂的具名类(直接匿名内部类就行了):