本篇内容介绍了“单例模式之怎么实现我的机器人女友”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!
public class GirlFriend { private String name; public GirlFriend(String name) { this.name = name; System.out.println("机器人女友制作完成"); } public void smile() { System.out.println("笑一个 :-)"); } public void housework() { System.out.println("去干家务"); } public void buKeMiaoShu() { System.out.println("......."); }}
public static void main(String[] args) { GirlFriend girlFriend = new GirlFriend("小丽"); girlFriend.smile(); girlFriend.housework(); girlFriend.buKeMiaoShu(); }
机器人女友制作完成笑一个 :-)去干家务.......
public class GirlFriend { private static GirlFriend girlFriend; private String name; private GirlFriend(String name) { this.name = name; System.out.println("机器人女友制作完成"); } /** * 对象通过getInstance方法获取 * @param name * @return */ public static GirlFriend getInstance(String name) { if(girlFriend == null) { girlFriend = new GirlFriend(name); } return girlFriend; } public void smile() { System.out.println("笑一个 :-)"); } public void housework() { System.out.println("去干家务"); } public void buKeMiaoShu() { System.out.println("......."); }}
public static void main(String[] args) { GirlFriend girlFriend = GirlFriend.getInstance("小丽"); girlFriend.smile(); girlFriend.housework(); girlFriend.buKeMiaoShu();}
public static void main(String[] args){ for(int i = 0; i < 5; i++) { new Thread(new Runnable() { @Override public void run() { GirlFriend girlFriend = GirlFriend.getInstance("小丽"); System.out.println(girlFriend); } }).start(); }}
机器人女友制作完成singleton.singleton.GirlFriend@95458f7机器人女友制作完成机器人女友制作完成singleton.singleton.GirlFriend@d9d8ad0singleton.singleton.GirlFriend@383a0basingleton.singleton.GirlFriend@d9d8ad0singleton.singleton.GirlFriend@d9d8ad0
/** * 对象通过getInstance方法获取 * @param name * @return */ public synchronized static GirlFriend getInstance(String name) { if(girlFriend == null) { girlFriend = new GirlFriend(name); } return girlFriend; }
public class GirlFriend { // 在类加载的时候就创建对象,是线程安全的 private static GirlFriend girlFriend = new GirlFriend("小丽"); private String name; private GirlFriend(String name) { this.name = name; System.out.println("机器人女友制作完成"); } /** * 对象通过getInstance方法获取 * @return */ public static GirlFriend getInstance() { return girlFriend; } public void smile() { System.out.println("笑一个 :-)"); } public void housework() { System.out.println("去干家务"); } public void buKeMiaoShu() { System.out.println("......."); }}
不支持延迟加载(在真正用到对象的时候,再创建实例),在类加载的时候对象就创建好了,如果对象在整个程序中一次都用不到,提前创建就浪费了。
不能控制对象的数量,我们完全可以声明多个对象,比如:GirlFriend girlFriend1;GirlFriend girlFriend2;GirlFriend girlFriend3。
我们可能没有足够的信息在静态初始化时,实例化每一个对象,对象的构造方法参数,可能要依赖程序后面的运算结果。
public class GirlFriend { // volatile关键字保证了每个线程看到的girlFriend对象都是最新的 private volatile static GirlFriend girlFriend; private String name; private GirlFriend(String name) { this.name = name; System.out.println("机器人女友制作完成"); } /** * 对象通过getInstance方法获取 * @param name * @return */ public static GirlFriend getInstance(String name) { if(girlFriend == null) { synchronized (GirlFriend.class) { if (girlFriend == null) { girlFriend = new GirlFriend(name); } } } return girlFriend; } public void smile() { System.out.println("笑一个 :-)"); } public void housework() { System.out.println("去干家务"); } public void buKeMiaoShu() { System.out.println("......."); }}
某个类只能有一个实例
它必须自行创建这个实例
它必须自行向整个系统提供这个实例
“单例模式之怎么实现我的机器人女友”的内容就介绍到这里了,感谢大家的阅读。如果想了解更多行业相关的知识可以关注亿速云网站,小编将为大家输出更多高质量的实用文章!
亿速云「云服务器」,即开即用、新一代英特尔至强铂金CPU、三副本存储NVMe SSD云盘,价格低至29元/月。点击查看>>
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。
原文链接:https://my.oschina.net/u/2884708/blog/4700727