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

时间: 2024-09-17 03:29:26

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

java监听-java中匿名类作为一个方法的参数的时候是不是默认返回一个匿名对象

问题描述 java中匿名类作为一个方法的参数的时候是不是默认返回一个匿名对象 java中匿名类作为一个方法的参数的时候是不是默认返回一个匿名对象 比如用在监听方法当中作为参数的时候 解决方案 可以这么理解,通常是创建一个匿名类的实例然后作为参数传递给指定方法 . 解决方案二: 匿名类,作为参数是返回相应的匿名对象. 具体还是要看调用的函数有参数要求吧,参数是一个对应的匿名类,或者其父类,使用它就没有问题.

Java使用设计模式中的工厂方法模式实例解析_java

工厂方法模式的定义工厂方法(Factory Method)模式的意义是定义一个创建产品对象的工厂接口,将实际创建工作推迟到子类当中.核心工厂类不再负责产品的创建,这样核心类成为一个抽象工厂角色,仅负责具体工厂子类必须实现的接口,这样进一步抽象化的好处是使得工厂方法模式可以使系统在不修改具体工厂角色的情况下引进新的产品. 它包含了如下角色: 抽象产品(Product) 具体产品(ConcreteProduct) 抽象工厂(Factory) 具体工厂(ConcreteFactory) 模式的UML类

Java设计模式编程中的工厂方法模式和抽象工厂模式_java

工厂方法模式 动机 创建一个对象往往需要复杂的过程,所以不适合包含在一个复合工厂中,当有新的产品时,需要修改这个复合的工厂,不利于扩展. 而且,有些对象的创建可以需要用到复合工厂访问不到的信息,所以,定义一个工厂接口,通过实现这个接口来决定实例化那个产品,这就是工厂方法模式,让类的实例化推迟到子类中进行. 目的 1. 定义一个接口,让子类决定实例化哪个产品. 2. 通过通用接口创建对象. 实现 1. 产品接口和具体产品很好理解. 2. 工厂类提供一个工厂方法,返回一个产品对象.但是这个工厂方法是

java中简单工厂模式、工厂方法模式、抽象工厂模式介绍

工厂模式适合凡是出现大量对象需要创建,而且这些对象拥有相同的接口,可以使用工厂模式进行创建. 简单工厂模式 简单工厂模式分为三种:普通工厂模式.多个方法工厂模式.静态方法工厂模式 -------------------------------------------------------------------------------- 以发送QQ消息或者微信消息为例来说明: 普通工厂模式 /**  * 两种共同的接口  */ public interface Message {     pu

java中匿名类有关键字new 实例化一个对象有关键字new

问题描述 java中匿名类有关键字new 实例化一个对象有关键字new java中匿名类有关键字new 实例化一个对象有关键字new 那么如何区分匿名类和实例化一个对象 解决方案 不用区分.其实两者是一回事. 你可以认为对匿名类new是一个特例,它产生一个这个类型,然后产生一个这个类型的对象. 本质上这里new还是实例化对象. 解决方案二: 在程序运行中,以及调用者看来,一个匿名类的对象和一个一般的对象是一回事. 解决方案三: 转化的中间代码两个是一回事儿 解决方案四: C++中关键字newne

装饰者模式(Decorator Pattern) Java的IO类的使用方法

Java的IO类使用装饰者模式进行扩展, 其中FilterInputStream类, 就是装饰者(decorator)的基类. 实现其他装饰者(decorator), 需要继承FilterInputStream类. 代码: /** * @time 2014年5月23日 */ package decorator.io; import java.io.FilterInputStream; import java.io.IOException; import java.io.InputStream;

java数据流DataInputstream类中的方法readBoolean()的作用是什么?

问题描述 java数据流DataInputstream类中的方法readBoolean()的作用是什么? 书上说readBoolean()的作用是读取一个布尔值,但是具体是 根据什么得到布尔值的?这个布尔值可以用于什么操作?跪求指点! 解决方案 从输入流读取,如果是0,就是false,否则就是true,bool值可以用来做逻辑判断. 解决方案二: 你写进去的时候的那个值,但需要顺序读取,写入时,第一个如果是int,那就读取时就要readInt,类似这样 解决方案三: JAVA中String类的i

java中看到类写在方法里面的类是什类啊

问题描述 java中看到类写在方法里面的类是什类啊 java中看到类写在方法里面的类是什类啊 void func (){class lei } 解决方案 方法内部的内部类的可见性更小,它只在方法内部可见,在外部类(及外部类的其它方法中)中都不可见了.同时,它有一个特点,就是方法内的内部类连本方法的成员变量都不可访问,它只能访问本方法的final型成员.同时另一个需引起注意的是方法内部定义成员,只允许final修饰或不加修饰符,其它像static等均不可用. 解决方案二: 内部类(匿名内部类) 解

源码-JDK1.7中java.lang.String类的toCharArray方法注释:不能用Arrays.copyOf实现?求解惑

问题描述 JDK1.7中java.lang.String类的toCharArray方法注释:不能用Arrays.copyOf实现?求解惑 JDK1.7重新设计了String类,各个String对象各自维护一个属于自身的char数组,下面是该类中的toCharArray方法的实现源码:public char[] toCharArray() { // Cannot use Arrays.copyOf because of class initialization order issues char