设计模式2——工厂
★ 场景和问题
Java程序开发讲究面向接口编程,隐藏具体的实现类,可是如何得到接口呢?
工厂类的命名规范:***Factory
单例工厂方法的命名规范:getInstance()
工厂的本质是“选择实现”
工厂、接口和实现类之间的技术边界:工厂只负责选择实现,实现类才做真正的实现,
而接口是限定到底实现什么东西和返回什么东西,三者之间分工明确、各负其责。
java代码实现:
package cn.hncu.patterns.exercise.factory;
import cn.hncu.patterns.exercise.factory.inter.A;
import cn.hncu.patterns.exercise.factory.model.AFactory;
/*
* 工厂实现测试:
* 验证工厂方法是选择实现,
* 接口指定功能,
* 实现类实现功能,
* 工厂选择实现类,
* 为客户提供不同的功能,
* 也就是返回不同的接口。
* 目的:
* 工厂选择功能。
* 实现类隐藏。
* 接口给客户。
*/
public class Client {
public static void main(String[] args) {
A a1 = AFactory.createA1();
A a2 = AFactory.createA2();
A a3 = AFactory.createA3();
a1.t1();// 输出1111111111111
a2.t1();// 输出2222222222222
a3.t1();// 输出33333
}
}
package cn.hncu.patterns.exercise.factory.model;
import cn.hncu.patterns.exercise.factory.imp.ImpA1;
import cn.hncu.patterns.exercise.factory.imp.ImpA2;
import cn.hncu.patterns.exercise.factory.imp.ImpA3;
import cn.hncu.patterns.exercise.factory.inter.A;
public class AFactory {
public AFactory() {
}
/*
* 使用类反射,
* 就可以把下列三个函数合并成一个函数
*/
public static A createA1() {
A a = new ImpA1();
return a;
}
public static A createA2() {
A a = new ImpA2();
return a;
}
public static A createA3() {
A a = new ImpA3();
return a;
}
}
package cn.hncu.patterns.exercise.factory.inter;
public interface A {
public abstract void t1();
}
package cn.hncu.patterns.exercise.factory.imp;
import cn.hncu.patterns.exercise.factory.inter.A;
public class ImpA1 implements A {
@Override
public void t1() {
System.out.println("1111111111111");
}
}
package cn.hncu.patterns.exercise.factory.imp;
import cn.hncu.patterns.exercise.factory.inter.A;
public class ImpA2 implements A {
@Override
public void t1() {
System.out.println("2222222222222");
}
}
package cn.hncu.patterns.exercise.factory.imp;
import cn.hncu.patterns.exercise.factory.inter.A;
public class ImpA3 implements A {
@Override
public void t1() {
System.out.println("33333");
}
}