public class Test {
    public static void main(String[] args) {
        Factories.test();
    }
}

/*
    设计模式之禅中的工厂模式是这样的,先定义好工厂和产品的接口,实现各个产品,
    产品无需为工厂编写任何代码。工厂通过传产品类的class对象来生成一个产品,这
    其中用到了反射方面的东西,我觉着这中方案会更好一点。

    案例中的方案,虽然利用接口降低了耦合,但是还是有点不太舒服
 */

interface Service {
    void method1();

    void method2();
}
interface ServiceFactory {
    Service getService();
}
class A implements Service {

    private A() {

    }

    @Override
    public void method1() {
        System.out.println("A method1");
    }

    @Override
    public void method2() {
        System.out.println("A method2");
    }

    public static ServiceFactory factory =
            new ServiceFactory() {
                @Override
                public Service getService() {
                    return new A();
                }
            };
}
class B implements Service {

    private B() {

    }

    @Override
    public void method1() {
        System.out.println("B method1");
    }

    @Override
    public void method2() {
        System.out.println("B method2");
    }

    public static ServiceFactory factory =
            new ServiceFactory() {
                @Override
                public Service getService() {
                    return new B();
                }
            };
}

class Factories{
    public static void serviceConsumer(ServiceFactory factory) {
        Service s = factory.getService();
        s.method1();
        s.method2();
    }

    public static void test() {
        serviceConsumer(A.factory);
        serviceConsumer(B.factory);
    }
}
public class Test {
    public static void main(String[] args) {
        Games.test();
    }
}

interface Game {
    boolean move();
}
interface GameFactory {
    Game getGame();
}
class Checkers implements Game{
    private Checkers() {};
    private int moves = 0;
    private static final int MOVES = 5;
    @Override
    public boolean move() {
        System.out.println("Checkers move " + move());
        return ++moves != MOVES;
    }

    public static GameFactory factory = new GameFactory() {
        @Override
        public Game getGame() {
            return new Checkers();
        }
    };
}
class Chess implements Game {
    private Chess() { }
    private int moves = 0;
    private static final int MOVES = 4;

    @Override
    public boolean move() {
        System.out.println("Chess move "+moves);
        return ++moves != MOVES;
    }

    public static GameFactory factory = new GameFactory() {
        @Override
        public Game getGame() {
            return new Chess();
        }
    };
}

public class Games {
    public static void playGame(GameFactory factory) {
        Game s = factory.getGame();
        while (s.move()) {

        }
    }

    public static void test() {
        playGame(Checkers.factory);
        playGame(Chess.factory);
    }
}

Java编程思想:利用内部类实现的工厂模式的更多相关文章

  1. Java编程思想__内部类

    1.对象.new语法 类结构 public class Outer { public String oName; class Inner { public String iName; public v ...

  2. Java编程思想:内部类其他知识点

    public class Test { public static void main(String[] args) { // InheritInner.test(); // EggTest.test ...

  3. Java编程思想:内部类中级部分

    public class Test { public static void main(String[] args) { // Parcel4Test.test(); // Parcel5_1.tes ...

  4. Java编程思想:内部类基础部分

    public class Test { public static void main(String[] args) { // Parcel1.test(); // Parcel2.test(); / ...

  5. Java编程思想学习(八) 内部类

    可以将一个类的定义放在另一个类的定义内部,这就是内部类. 内部类的定义是简单的,但是它的语法确实很是复杂,让人不是很好理解.下面就内部类做一个小结. 一.内部类的分类 总的来讲内部类分为普通内部类,匿 ...

  6. JAVA编程思想——分析阅读

    需要源码.JDK1.6 .编码风格参考阿里java规约 7/12开始 有点意识到自己喜欢理论大而泛的模糊知识的学习,而不喜欢实践和细节的打磨,是因为粗心浮躁导致的么? cron表达式使用 设计能力.领 ...

  7. Java编程思想(11~17)

    [注:此博客旨在从<Java编程思想>这本书的目录结构上来检验自己的Java基础知识,只为笔记之用] 第十一章 持有对象 11.1 泛型和类型安全的容器>eg: List<St ...

  8. Java编程思想 (1~10)

    [注:此博客旨在从<Java编程思想>这本书的目录结构上来检验自己的Java基础知识,只为笔记之用] 第一章 对象导论 1.万物皆对象2.程序就是对象的集合3.每个对象都是由其它对象所构成 ...

  9. Java 编程思想 Chapter_14 类型信息

    本章内容绕不开一个名词:RTTI(Run-time Type Identification) 运行时期的类型识别 知乎上有人推断作者是从C++中引入这个概念的,反正也无所谓,理解并能串联本章知识才是最 ...

随机推荐

  1. 微信小程序把玩(二十三)modal组件

    原文:微信小程序把玩(二十三)modal组件 modal弹出框常用在提示一些信息比如:退出应用,清楚缓存,修改资料提交时一些提示等等. 常用属性: wxml <!--监听button点击事件-- ...

  2. 不同格式图片相互转换的开源库分享(使用CxImage,并有VC6的配置过程)

    不同格式图片相互转换的开源库分享 一.背景 笔者在项目的开发中,需要调用windows下的COM接口SetIconLocation来实现桌面快捷方式.而我们项目中给定的图片格式为png格式,SetIc ...

  3. 更换Qt QtEmbedded库的版本出现问题及解决(交叉编译OpenSSL)

    近日将QtEmbedded库的版本由4.7.0更新到4.7.4.工具链并未改变,仍为 Target: arm-none-linux-gnueabiConfigured with: ......Thre ...

  4. Windows 7 频繁提示:计算机的内存不足

    最近由于同时打开的程序比较多,Windows 7 频繁提示:计算机的内存不足,如下图: 问题原因: 经过一番尝试,得出一个大概的结论:当虚拟内存空间的大小小于物理内存空间的大小时,一旦程序开的太多,物 ...

  5. c# log4net 配置使用

    新增配置文件log4net.config,内容如下 <?xml version="1.0" encoding="utf-8" ?> <conf ...

  6. 解决npm install卡住不动的小尴尬

    npm install卡顿问题记录 遇到的问题 npm install -g @angular/cli 安装angular cli工具时,发现进度条一直卡住不动,相信很多朋友也遇到过.原因应该是国内的 ...

  7. 快速开发第一个SpringBoot应用

    通过笔者这段实践SpringBoot的学习,发现自从使用了SpringBoot后,就再也回不去SpringMVC了,因为相比于SpringMVC,SpringBoot真是太高效率了.下面我们看看它效率 ...

  8. SpringBoot从入门到精通一(idea优雅搭建SpringBoot项目)

    前言 在没有SpringBoot之前,我们搭建的是SSM(SpingMVC+Spring+Mybatis)项目,在搭建SSM项目的时候,我们要经过一系列的繁琐配置,例如:application,web ...

  9. 【协议】TCP与UDP

    转载地址:https://blog.csdn.net/qq_34988624/article/details/85856848 1.为什么会有TCP/IP协议 在世界上各地,各种各样的电脑运行着各自不 ...

  10. node.js中模块,require

    在php,C++中都有命名空间的概念,命名空间主要是用来解决引入文件存在函数,类,变量重名的问题,在node.js中,没有命名空间这么复杂的概念,在node中,有模块的概念,也就是将功能性的代码都放在 ...