对比.net使用Java的匿名类对工厂方法模式提供更优雅的实现

简介:

工厂模式的意图:

定义一个用户创建对象的接口,让子类决定实例化哪一个类。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);
	}

调用结果:



原文发布时间为:2011-07-09


本文作者:vinoYang


本文来自云栖社区合作伙伴CSDN博客,了解相关信息可以关注CSDN博客。

目录
相关文章
|
30天前
|
设计模式 Java API
【设计模式】JAVA Design Patterns——Combinator(功能模式)
【设计模式】JAVA Design Patterns——Combinator(功能模式)
|
1月前
|
设计模式 监控 Java
【设计模式】JAVA Design Patterns——Circuit Breaker(断路器模式)
【设计模式】JAVA Design Patterns——Circuit Breaker(断路器模式)
|
1月前
|
设计模式 Java 程序员
【设计模式】JAVA Design Patterns——Bytecode(字节码模式)
【设计模式】JAVA Design Patterns——Bytecode(字节码模式)
|
1月前
|
设计模式 算法 Java
【设计模式】JAVA Design Patterns——Builder(构造器模式)
【设计模式】JAVA Design Patterns——Builder(构造器模式)
|
6天前
|
Java C# 数据安全/隐私保护
|
28天前
|
设计模式 Java 数据库
【设计模式】JAVA Design Patterns——Converter(转换器模式)
转换器模式旨在实现不同类型间的双向转换,减少样板代码。它通过通用的Converter类和特定的转换器(如UserConverter)简化实例映射。Converter类包含两个Function对象,用于不同类型的转换,同时提供列表转换方法。当需要在逻辑上对应的类型间转换,或处理DTO、DO时,此模式尤为适用。
【设计模式】JAVA Design Patterns——Converter(转换器模式)
|
8天前
|
安全 Java
深入理解 Java 泛型工厂方法:类型安全与灵活性的结合
深入理解 Java 泛型工厂方法:类型安全与灵活性的结合
9 1
|
30天前
|
消息中间件 缓存 Java
【Java】全套云HIS(医院信息管理系统)可对接医保 采用云端SaaS模式部署
总体框架: SaaS应用,全浏览器访问 前后端分离,多服务协同 服务可拆分,功能易扩展
51 1
【Java】全套云HIS(医院信息管理系统)可对接医保 采用云端SaaS模式部署
|
19天前
|
设计模式 存储 编译器
【.NET Core】异步编程模式
【.NET Core】异步编程模式
21 2
|
23天前
|
存储 前端开发 Java
Java一分钟之-Java GUI设计原则与模式
本文介绍了Java GUI开发的核心设计原则和模式,包括分层架构(MVC)、组件复用、用户体验和代码示例。强调了MVC模式以提高代码可维护性,组件化设计以增强复用性,以及响应式和简洁界面以提升用户体验。同时,提出了常见问题的避免策略,如布局管理、资源释放和国际化支持,建议开发者遵循这些原则以提升GUI应用质量。
70 3