设计模式——工厂模式

工厂模式的核心是隐藏子类的具体的实现,通过工厂方法获取接口的具体的子类的实现。

就像在某宝买衣服,你想买的可以是耐克阿迪或美邦。你只需要搜索相应的关键词即可,然后某宝给你显示响应的商品。但你不需要必须去你想买的衣服的专卖店里去买,这就很麻烦。万一你在逛着逛着耐克,你突然觉得 你的所有家当就够买美邦的,你又得跑到美邦的店里。发现你竟然连美邦都买不起了,。。。。。心里一万个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:老了老了,喝啤酒都得泡枸杞了。。。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值