对比.net使用Java的匿名类对工厂方法模式提供更优雅的实现
2011-07-09 22:02
555 查看
工厂模式的意图:
定义一个用户创建对象的接口,让子类决定实例化哪一个类。Factory Method使一个类的实例化延迟到其子类。
结构图:
场景:
这里制造两个手机product:Nokia、Motorola,为了制造这两个Product需要使用两个Creator(Factory)来制造它们。这两个Creator都有各自的Concreator(类似生产线)。这两个手机都实现必须实现两个最基本的功能:call(打电话)、photo(拍照)。
product:
Creator:定义生产线必须遵守的契约(创建产品):
ConcreateCreator:各自的生产线(用于生产不同的产品)
ConcreateProduct:生产产品(制造工艺)
下面,我们看看,如何来“制造”出product:
首先,我们“指明”制造产品的工厂,然后我们使用工厂来生产出我们的产品,对于具体的制造工艺,我们没有知道的必要。
然后,我们使用了产品的功能:
可以看到,我们实现了我们的意图:定义一个用户创建对象的接口(IMobilephoneFactory ),让子类决定实例化哪一个类。Factory Method使一个类的实例化延迟到其子类。
好了,以上就是Factory Method partten的一个简要实现(这个不是重点)。我们看到了要实现这样一个模式,需要大概做哪些事情。
那么,有没有稍微优雅点的实现方式呢。其实,在Java中,使用匿名类,可以有更简便的做法:
product:
Creator:
ConcreatCreator and ConcreatProduct:下面我们能利用java里的匿名类将各自的工厂和制造流程合二为一。
我们看到,在提供具体的构造过程之后,使用了匿名类,提供了该***流程的工厂。该工厂返回了这个***流程。并且保证该制造流程只提供给工厂访问,因为构造器被设置为私有的了。这在语法上提供了更便捷和更优雅的实现,并且也体现了职责单一的面向对象原则。一个类包含了一个职责:制造出应该制造的产品,并能够以一个指定的接口(factory)对外提供服务。
下面看一下,我们怎么对外提供服务呢?
我们做了一个服务器,来提供无依赖的服务:
你只需要提供创建服务的具体工厂(ConcreateCreator),就可以为了创建该产品,并让它提供服务了:
调用结果:
定义一个用户创建对象的接口,让子类决定实例化哪一个类。Factory Method使一个类的实例化延迟到其子类。
结构图:
场景:
这里制造两个手机product:Nokia、Motorola,为了制造这两个Product需要使用两个Creator(Factory)来制造它们。这两个Creator都有各自的Concreator(类似生产线)。这两个手机都实现必须实现两个最基本的功能:call(打电话)、photo(拍照)。
product:
/// <summary> /// Product /// </summary> public abstract class Mobilephone { public abstract void Call(); public abstract void Photo(); }
Creator:定义生产线必须遵守的契约(创建产品):
/// <summary> /// Creator /// </summary> public interface IMobilephoneFactory { Mobilephone CreateMobilephone(); }
ConcreateCreator:各自的生产线(用于生产不同的产品)
/// <summary> /// ConcreateCreator:NokiaFactory /// </summary> public class NokiaFactory:IMobilephoneFactory { public Mobilephone CreateMobilephone() { return new Nokia(); } }
/// <summary> /// ConcreateCreator:MotorolaFactory /// </summary> public class MotorolaFactory:IMobilephoneFactory { public Mobilephone CreateMobilephone() { return new Motorola(); } }
ConcreateProduct:生产产品(制造工艺)
/// <summary> /// Product:Nokia /// </summary> public class Nokia : Mobilephone { public override void Call() { Console.WriteLine("The Nokia's call function"); } public override void Photo() { Console.WriteLine("The Nokia's Photo function"); } }
/// <summary> /// Product:Motorola /// </summary> public class Motorola:Mobilephone { public override void Call() { Console.WriteLine("The motorola's call function"); } public override void Photo() { Console.WriteLine("The motorola's Photo function"); } }
下面,我们看看,如何来“制造”出product:
static void Main(string[] args) { IMobilephoneFactory factory = new MotorolaFactory(); //create Motorola Mobilephone mobilePhone = factory.CreateMobilephone(); mobilePhone.Call(); mobilePhone.Photo(); factory = new NokiaFactory(); mobilePhone = factory.CreateMobilephone(); mobilePhone.Call(); mobilePhone.Photo(); Console.Read(); }
首先,我们“指明”制造产品的工厂,然后我们使用工厂来生产出我们的产品,对于具体的制造工艺,我们没有知道的必要。
然后,我们使用了产品的功能:
可以看到,我们实现了我们的意图:定义一个用户创建对象的接口(IMobilephoneFactory ),让子类决定实例化哪一个类。Factory Method使一个类的实例化延迟到其子类。
好了,以上就是Factory Method partten的一个简要实现(这个不是重点)。我们看到了要实现这样一个模式,需要大概做哪些事情。
那么,有没有稍微优雅点的实现方式呢。其实,在Java中,使用匿名类,可以有更简便的做法:
product:
/* * product:Mobilephone */ public abstract class Mobilephone { public abstract void call(); public abstract void photo(); }
Creator:
/* * Creator */ public interface IMobilephoneFactory { Mobilephone CreateMobilephone(); }
ConcreatCreator and ConcreatProduct:下面我们能利用java里的匿名类将各自的工厂和制造流程合二为一。
public class Nokia extends Mobilephone { @Override public void call() { System.out.println("The Nokia's call function"); } @Override public void photo() { System.out.println("The Nokia's Photo function"); } private Nokia(){} public static IMobilephoneFactory factory= new IMobilephoneFactory() { @Override public Mobilephone CreateMobilephone() { return new Nokia(); } }; }
public class Motorola extends Mobilephone { @Override public void call() { System.out.println("The Motorola's call function"); } @Override public void photo() { System.out.println("The Motorola's Photo function"); } private Motorola(){} public static IMobilephoneFactory factory = new IMobilephoneFactory() { @Override public Mobilephone CreateMobilephone() { return new Motorola(); } }; }
我们看到,在提供具体的构造过程之后,使用了匿名类,提供了该***流程的工厂。该工厂返回了这个***流程。并且保证该制造流程只提供给工厂访问,因为构造器被设置为私有的了。这在语法上提供了更便捷和更优雅的实现,并且也体现了职责单一的面向对象原则。一个类包含了一个职责:制造出应该制造的产品,并能够以一个指定的接口(factory)对外提供服务。
下面看一下,我们怎么对外提供服务呢?
public static void mobileMaker(IMobilephoneFactory factory) { Mobilephone mobilephone=factory.CreateMobilephone(); mobilephone.call(); mobilephone.photo(); }
我们做了一个服务器,来提供无依赖的服务:
public static void mobileServiceWith(IMobilephoneFactory factory) { Mobilephone mobilephone=factory.CreateMobilephone(); mobilephone.call(); mobilephone.photo(); }
你只需要提供创建服务的具体工厂(ConcreateCreator),就可以为了创建该产品,并让它提供服务了:
/** * @param args */ public static void main(String[] args) { System.out.println("nokia factory to make nokia and service:"); //make nokia mobileServiceWith(Nokia.factory); System.out.println(); System.out.println("motorola factory to make motorola and service:"); //make motorola mobileMaker(Motorola.factory); }
调用结果:
相关文章推荐
- 对比.net使用Java的匿名类对工厂方法模式提供更优雅的实现
- 使用Kotlin实现Android简单Demo,对比JAVA实现分析具体语法不同之处(一)
- Rhino 是一个完全使用Java语言编写的开源JavaScript实现。Rhino通常用于在Java程序中,为最终用户提供脚本化能力。它被作为J2SE 6上的默认Java脚本化引擎。
- 使用自定义属性实现Java和.net的XML序列化
- 使用Delphi 通过WebServices 要想实现到.Net 或者是Java的WebServices 头验证.
- Java多线程之使用volatile优雅地实现单例
- Java后台使用支付宝进行支付实现---使用阿里提供的对应服务的支付宝接口
- 使用自定义属性实现Java和.net的XML序列化
- 使用Kotlin实现Android简单Demo,对比JAVA实现分析具体语法不同之处(二)
- 使用java提供的Observable,实现观察者模式
- 使用 .NET实现JavaTM Pet Store J2EETM 蓝图应用程序
- MD5加密-使用LR javauser协议实现
- 使用XStream实现Java对象与XML之间的快速互转
- 遗传算法使用Java实现
- 时间序列数据库KDB 与Java结合使用介绍 -- 2 基于KDB Java的写入实现
- Quartz使用-入门使用(java定时任务实现)
- Java 匿名类也能使用构造函数
- 使用spring-loaded开源项目,实现java程序和web应用的热部署
- Java微信公众平台开发(九)——关键字回复以及客服接口实现(该公众号暂时无法提供服务解决方案)
- 使用 Router 实现的模块化,如何优雅的回到主页面