工厂模式的核心是隐藏子类的具体的实现,通过工厂方法获取接口的具体的子类的实现。
就像在某宝买衣服,你想买的可以是耐克阿迪或美邦。你只需要搜索相应的关键词即可,然后某宝给你显示响应的商品。但你不需要必须去你想买的衣服的专卖店里去买,这就很麻烦。万一你在逛着逛着耐克,你突然觉得 你的所有家当就够买美邦的,你又得跑到美邦的店里。发现你竟然连美邦都买不起了,。。。。。心里一万个mmp。所以你可以在某宝只需要动动手指就可以了。当然你陪女朋友逛街就当我放P。
工厂模式就是这样。你先确定了你想买衣服,就创建一个接口,接下来你要确顶买那种衣服,只需要通过工厂方法即可获取你想要的具体的实现。
优点:
1、调用者想创建一个对象,只需要知道相应的名称就可以了。
2、扩展性高,如果想增加一个具体的实现,只需要增加你的实现,然后扩展工厂类即可。
3、可以屏蔽具体的实现,调用者只关心产品的接口就好了。
缺点:
每次增加一个产品时,都需要增加一个具体类和对象实现工厂,使得系统中类的个数成倍增加,在一定程度上增加了系统的复杂度,同时也增加了系统具体类的依赖。这并不是什么好事。
使用场景:
1、日志记录器:记录可能记录到本地硬盘、系统事件、远程服务器等,用户可以选择记录日志到什么地方。 2、数据库访问,当用户不知道最后系统采用哪一类数据库,以及数据库可能有变化时。 3、设计一个连接服务器的框架,需要三个协议,"POP3"、"IMAP"、"HTTP",可以把这三个作为产品类,共同实现一个接口。
注意事项:
作为一种创建类模式,在任何需要生成复杂对象的地方,都可以使用工厂方法模式。有一点需要注意的地方就是复杂对象适合使用工厂模式,而简单对象,特别是只需要通过 new 就可以完成创建的对象,无需使用工厂模式。如果使用工厂模式,就需要引入一个工厂类,会增加系统的复杂度。
实现:
首先创建一个Human接口,创建Children、Adult、Old三个类用于实现Human接口。创建一个HumanFactory工厂管理类,用于创建相应的对象。以便获取相应的类型。
Human接口:
package mode.factory;
public interface Human {
public void age();
}
Children实现:
package mode.factory;
public class Children implements Human {
@Override
public void age() {
// TODO Auto-generated method stub
System.out.println("我还是个孩子,人家还没到18呢。。。。");
}
}
Adult实现:
package mode.factory;
public class Adult implements Human {
@Override
public void age() {
// TODO Auto-generated method stub
System.out.println("大家都是成年人,说话。。。。。");
}
}
Old实现:
package mode.factory;
public class Old implements Human{
@Override
public void age() {
// TODO Auto-generated method stub
System.out.println("老了老了,喝啤酒都得泡枸杞了。。。");
}
}
创建工厂方法:
package mode.factory;
public class HumanFactory {
public Human getHuman(String humanType) {
if(humanType==null){
return null;
}
if(humanType.equalsIgnoreCase("OLD")){
return new Old();
}
if(humanType.equalsIgnoreCase("children")){
return new Children();
}
if(humanType.equalsIgnoreCase("adult")){
return new Adult();
}
return null;
}
}
测试:
package mode.factory;
public class FactoryDemo {
public static void main(String[] args) {
HumanFactory humanFactory = new HumanFactory();
Human children = humanFactory.getHuman("children");
Human adult = humanFactory.getHuman("adult");
Human old = humanFactory.getHuman("old");
System.out.print("children:");
children.age();
System.out.print("adult:");
adult.age();
System.out.print("old:");
old.age();
}
}
输出结果:
children:我还是个孩子,人家还没到18呢。。。。
adult:大家都是成年人,说话。。。。。
old:老了老了,喝啤酒都得泡枸杞了。。。