介绍
工厂模式定义创建对象的接口,让子类决定实例化哪个类。
主要解决:隐藏对象创建逻辑
使用场景:
1.日志记录器:记录可能记录到本地硬盘、系统事件、远程服务器等,用户可以选择记录日志到什么地方。
2.数据库访问,当用户不知道最后系统采用哪一类数据库,以及数据库可能有变化时。
3.设计一个连接服务器的框架,需要三个协议,"POP3"、"IMAP"、"HTTP",可以把这三个作为产品类,共同实现一个接口。
优点:
1.隐藏对象创建逻辑,用户只需知道名称就可以了。
2.可扩展性高如果想增加一个产品,只要扩展一个工厂类就可以。
缺点:
1.类结构的复杂化。每次增加产品都需要增加一个具体类和对象实现工厂。
UML类图
代码实现
People.java
public abstract class People {
public abstract void speak();
}
Woman.java
public class Woman extends People{
@Override
public void speak() {
System.out.println("I am a woman!");
}
}
Man.java
public class Man extends People{
@Override
public void speak() {
System.out.println("I am a man!");
}
}
PeopleFactory.java
public class PeopleFactory {
public <T extends People> T create(Class<T> clz){
People p = null;
try {
p = (People)Class.forName(clz.getName()).newInstance();
p.speak();
} catch (InstantiationException | IllegalAccessException | ClassNotFoundException e) {
e.printStackTrace();
}
return (T)p;
}
}
Main.java
public class Main {
public static void main(String[] args) {
PeopleFactory factory = new PeopleFactory();
factory.create(Woman.class);
factory.create(Man.class);
}
}
输出
I am a woman!
I am a man!