对比.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博客。

目录
相关文章
|
4月前
|
Java 应用服务中间件 Docker
java-web部署模式概述
本文总结了现代 Web 开发中 Spring Boot HTTP 接口服务的常见部署模式,包括 Servlet 与 Reactive 模型、内置与外置容器、物理机 / 容器 / 云环境部署及单体与微服务架构,帮助开发者根据实际场景选择合适的方案。
138 25
|
4月前
|
存储 Java 大数据
Java 大视界 -- Java 大数据在智能家居能源消耗模式分析与节能策略制定中的应用(198)
简介:本文探讨Java大数据技术在智能家居能源消耗分析与节能策略中的应用。通过数据采集、存储与智能分析,构建能耗模型,挖掘用电模式,制定设备调度策略,实现节能目标。结合实际案例,展示Java大数据在智能家居节能中的关键作用。
|
6月前
|
数据采集 自然语言处理 Java
Playwright 多语言一体化——Python/Java/.NET 全栈采集实战
本文以反面教材形式,剖析了在使用 Playwright 爬取懂车帝车友圈问答数据时常见的配置错误(如未设置代理、Cookie 和 User-Agent),并提供了 Python、Java 和 .NET 三种语言的修复代码示例。通过错误示例 → 问题剖析 → 修复过程 → 总结教训的完整流程,帮助读者掌握如何正确配置爬虫代理及其它必要参数,避免 IP 封禁和反爬检测,实现高效数据采集与分析。
317 3
Playwright 多语言一体化——Python/Java/.NET 全栈采集实战
|
6月前
|
供应链 JavaScript 前端开发
Java基于SaaS模式多租户ERP系统源码
ERP,全称 Enterprise Resource Planning 即企业资源计划。是一种集成化的管理软件系统,它通过信息技术手段,将企业的各个业务流程和资源管理进行整合,以提高企业的运营效率和管理水平,它是一种先进的企业管理理念和信息化管理系统。 适用于小微企业的 SaaS模式多租户ERP管理系统, 采用最新的技术栈开发, 让企业简单上云。专注于小微企业的应用需求,如企业基本的进销存、询价,报价, 采购、销售、MRP生产制造、品质管理、仓库库存管理、财务应收付款, OA办公单据、CRM等。
342 23
|
7月前
|
数据采集 自然语言处理 JavaScript
Playwright多语言生态:跨Python/Java/.NET的统一采集方案
随着数据采集需求的增加,传统爬虫工具如Selenium、Jsoup等因语言割裂、JS渲染困难及代理兼容性差等问题,难以满足现代网站抓取需求。微软推出的Playwright框架,凭借多语言支持(Python/Java/.NET/Node.js)、统一API接口和优异的JS兼容性,解决了跨语言协作、动态页面解析和身份伪装等痛点。其性能优于Selenium与Puppeteer,在学术数据库(如Scopus)抓取中表现出色。行业应用广泛,涵盖高校科研、大型数据公司及AI初创团队,助力构建高效稳定的爬虫系统。
351 2
Playwright多语言生态:跨Python/Java/.NET的统一采集方案
|
数据库 开发者
.NET 异步编程之谜:async/await 模式究竟隐藏着怎样的神奇力量?
【8月更文挑战第28天】在当今注重效率和响应性的软件开发领域,.NET 的 async/await 模式如同得力助手,简化异步代码编写,使代码更易理解和维护。通过后台执行耗时操作,如网络请求和数据库查询,避免阻塞主线程,显著提升系统响应性。此模式不仅适用于网络请求,还广泛应用于数据库操作和文件读写。合理使用 async/await 可大幅优化性能,但需注意避免过度使用、正确处理调用链及异常,以确保系统稳定性和高效性。深入探索 async/await,助您构建更出色的应用程序。
118 0
|
11月前
|
存储 NoSQL MongoDB
.NET MongoDB数据仓储和工作单元模式封装
.NET MongoDB数据仓储和工作单元模式封装
151 15
|
12月前
|
Java 网络安全 Maven
Exception in thread "main" java.lang.NoSuchMethodError: okhttp3.OkHttpClient$Builder.sslSocketFactory(Ljavax/net/ssl/SSLSocketFactory;Ljavax/net/ssl/X509TrustManager;)Lokhttp3/OkHttpClient$Builder; 问题处理
【10月更文挑战第26天】Exception in thread "main" java.lang.NoSuchMethodError: okhttp3.OkHttpClient$Builder.sslSocketFactory(Ljavax/net/ssl/SSLSocketFactory;Ljavax/net/ssl/X509TrustManager;)Lokhttp3/OkHttpClient$Builder; 问题处理
488 2
|
设计模式 XML 存储
【二】设计模式~~~创建型模式~~~工厂方法模式(Java)
文章详细介绍了工厂方法模式(Factory Method Pattern),这是一种创建型设计模式,用于将对象的创建过程委托给多个工厂子类中的某一个,以实现对象创建的封装和扩展性。文章通过日志记录器的实例,展示了工厂方法模式的结构、角色、时序图、代码实现、优点、缺点以及适用环境,并探讨了如何通过配置文件和Java反射机制实现工厂的动态创建。
【二】设计模式~~~创建型模式~~~工厂方法模式(Java)
|
设计模式 XML Java
【一】设计模式~~~创建型模式~~~简单工厂模式(Java)
文章详细介绍了简单工厂模式(Simple Factory Pattern),这是一种创建型设计模式,用于根据输入参数的不同返回不同类的实例,而客户端不需要知道具体类名。文章通过图表类的实例,展示了简单工厂模式的结构、时序图、代码实现、优缺点以及适用环境,并提供了Java代码示例和扩展应用,如通过配置文件读取参数来实现对象的创建。
【一】设计模式~~~创建型模式~~~简单工厂模式(Java)
下一篇
开通oss服务