public interface Product{
public void produce();
}
2、接口的实现类
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
class A implements Product{
@Override
public void produce() {
System.out.println("produce -- A");
}
}
class B implements Product{
@Override
public void produce() {
System.out.println("produce -- B");
}
}
3、工厂类
1
2
3
4
5
6
7
8
9
10
public class SimpleFactory {
public static Product produce(String name){
if("A".equals(name))
return new A();
else if("B".equals(name))
return new B();
else
return null;
}
}
4、测试类
1
2
3
4
5
6
7
8
9
10
11
12
13
public class Main {
public static void main(String[] args) {
Product product = SimpleFactory.produce("A");
product.produce();
Product product1 = SimpleFactory.produce("B");
product1.produce();
/**
* produce -- A
* produce -- B
*/
}
}
从上面可以看到,当我们需要改变功能的时候,就需要改变上面的工厂,这很明显不符合 开放-封闭原则 。
通过反射来改进上面的工厂类
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
public class SimpleFactory {
public static Object produce(Class<? extends Product> name){ //继承Product的Class对象
Object o = null;
try {
o = Class.forName(name.getName()).newInstance();
} catch (InstantiationException e) {
e.printStackTrace();
} catch (IllegalAccessException e) {
e.printStackTrace();
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
return o;
}
}
测试类
1
2
3
4
5
6
7
8
9
10
11
12
13
public class Main {
public static void main(String[] args) {
Product product = (Product) SimpleFactory.produce(com.demo.factory.A.class);
product.produce();
Product product1 = (Product) SimpleFactory.produce(com.demo.factory.B.class);
product1.produce();
/**
* produce -- A
* produce -- B
*/
}
}
public interface FactoryInterface {
public Product produces();
}
然后分别创建A类的工厂类和B类的工厂类并都实现FactoryInterface接口,如下
1
2
3
4
5
6
public class A_Factory implements FactoryInterface {
@Override
public Product produces() {
return new A();
}
}
1
2
3
4
5
6
public class B_Factory implements FactoryInterface {
@Override
public Product produces() {
return new B();
}
}
测试类
1
2
3
4
5
6
7
8
9
10
11
12
13
public class Main {
public static void main(String[] args) {
A a = (A) new A_Factory().produces();
a.produce();
B b = (B) new B_Factory().produces();
b.produce();
/**
* produce -- A
* produce -- B
*/
}
}
public interface Shoes {
public void exercise();
}
鞋带接口
1
2
3
public interface Shoelaces {
public void tie();
}
Anta类
1
2
3
4
5
6
public class Anta implements Shoes{
@Override
public void exercise() {
System.out.println("安踏鞋子");
}
}
耐克类
1
2
3
4
5
6
public class Nike implements Shoes{
@Override
public void exercise() {
System.out.println("耐克鞋子");
}
}
安踏鞋带类
1
2
3
4
5
6
public class AntaShowlaces implements Shoelaces {
@Override
public void tie() {
System.out.println("安踏鞋子系鞋带");
}
}
耐克鞋带类
1
2
3
4
5
6
public class NikeShowlaces implements Shoelaces {
@Override
public void tie() {
System.out.println("耐克鞋子系鞋带");
}
}
工厂接口
1
2
3
4
public interface Factory { //工厂
public Shoes produceShoes();
public Shoelaces produceShoelaces();
}
安踏工厂
1
2
3
4
5
6
7
8
9
10
11
public class AntaFactory implements Factory{
@Override
public Shoes produceShoes() {
return new Anta();
}
@Override
public Shoelaces produceShoelaces() {
return new AntaShowlaces();
}
}
耐克工厂
1
2
3
4
5
6
7
8
9
10
11
public class NikeFactory implements Factory{
@Override
public Shoes produceShoes() {
return new Nike();
}
@Override
public Shoelaces produceShoelaces() {
return new NikeShowlaces();
}
}