设计模式03---设计模式之简单工厂01---初始简单工厂

1.接口回忆

1.1.Java接口概念

    接口是一种特殊的抽象类,跟一般的抽象类相比,接口里面所有的方法都是抽象方法,所有的属性都是常量。

1.2.接口用来干什么

    可以实现不同类的相同行为,而不需要考虑这些类之间的层次关系。接口就是实现类对外的外观。

1.3.接口的思想

    浓缩一下,接口思想就是“封装隔离”

    所谓封装:是指“对被隔离体的行为的封装”,或者是“对被隔离体的职责的封装”

    所谓隔离:是指“外部调用和外部实现只能通过接口调用和由接口实现,外部调用是不知道内部具体实现的,也就是说:外部调用和内部实现是用接口隔离开的”

1.4.使用接口的好处

      由于外部调用和内部实现被接口隔离开了,所以只要接口不变,那么内部实现的变化就不会影响外部应用,从而使系统更灵活,具有更好的扩展性和可维护性。这也就是所谓的“接口是系统可插拔性的保证”。

1.5.接口和抽象类的选择

    优先使用接口

    在既要定义子类的行为,又要为子类提供公共的功能时候应该选择抽象类。

2.java中接口的使用问题。(以代码形式进行分析)

package simple.factory.demo;

/**
 * 接口的定义,该接口可以通过简单工厂来创建
 */
public interface Api {
	/**
	 * 具体功能方法的定义
	 * 
	 * @param s
	 *            示意,需要的参数
	 */
	public void operation(String s);
}

package simple.factory.demo;

/**
 * 接口的具体实现类A
 */
public class ImplA implements Api {

	@Override
	public void operation(String s) {
		// 实现功能的代码,示意一下
		System.out.println("ImplA s = " + s);
	}
}

package simple.factory.demo;

/**
 * 客户端,使用Api接口
 */
public class Client {
	public static void main(String[] args) {
		Api api = new ImplA();
		api.operation("仅仅是用来测试的。。。");
	}
}

通过代码示意:大家可以看出来,客户端在调用的时候,客户端不但知道了接口,还知道了具体的实现类就是ImplA。接口的思想是封装隔离,这样明显不符合他的思想,因为按照封装隔离的思想,客户端应该不知道具体的实现类是ImplA。所以这就是问题所在

3.怎么解决呢?这就需要用到我们的简单工厂模式了。代码如下(是5个java文件,看清java名字)

package simple.factory.demo;

/**
 * 接口的定义,该接口可以通过简单工厂来创建
 */
public interface Api {
	/**
	 * 具体功能方法的定义
	 * 
	 * @param s
	 *            示意,需要的参数
	 */
	public void operation(String s);
}

package simple.factory.demo;

/**
 * 接口的具体实现类A
 */
public class ImplA implements Api {

	@Override
	public void operation(String s) {
		// 实现功能的代码,示意一下
		System.out.println("ImplA s = " + s);
	}
}

package simple.factory.demo;

/**
 * 接口的具体实现类B
 */
public class ImplB implements Api {

	@Override
	public void operation(String s) {
		// 实现功能的代码,示意一下
		System.out.println("ImplB s = " + s);
	}
}

package simple.factory.demo;

public class Factory {
	/**
	 * 具体创建Api对象的方法
	 * 
	 * @param condition
	 *            示意:从外部传入的条件
	 * @return 创建好的Api对象
	 */
	public static Api createApi(int condition) {
		Api api = null;
		if (condition == 1) {
			api = new ImplA();
		} else if (condition == 2) {
			api = new ImplB();
		}
		return api;
	}

}

package simple.factory.demo;

/**
 * 客户端,使用Api接口
 */
public class Client {
	public static void main(String[] args) {
		// 通过简单工厂来获取接口对象
		Api api = Factory.createApi(1);
		api.operation("正在创建简单工厂");
	}
}

这样的话,是不是就完全实现了接口的“封装隔离”的思想了。


您的回应...

相关话题

查看全部

也许你感兴趣

换一批

热门标签

更多