每天一个设计模式之(2)-----工厂模式

1.为什么要使用工厂模式

    在网上看了很多篇文章,都说工厂模式华而不实,但是Spring容器中却大量了使用工厂模式,比如BeanFactory等,下面这篇文章分析的或许有点道理:

http://blog.csdn.net/lovelion/article/details/7523392

依博主个人而言,工厂模式主要是用来管理的作用的。有的接口有很多很多实现类,为了方便它们的创建和统一管理,工厂模式应运而生。

2.先上波类图

    现在通常会把工厂模式分成3种,但是究其思想,就是越来越抽象而已,越抽象就代表着其扩展性越强。所以直接分析最抽象的 抽象工厂模式

152800_5l3P_3582320.png

    讲解一下这个类图,首先有个Human接口,它有两个实现类,黑种人和黄种人,(为了方便,白种人就不写了)。我们的目的就是通过工厂去造人,而不是直接 new YellowHuamn();

    接下来就是工厂模式的类图了,先看一下AbstractHumanFactory,这是一个抽象工厂,它宣称它会createHuman(Class<T>),基于这个抽象工厂,我们可以给他实例化很多工厂,例如(儿童工厂,成人工厂,老人工厂),为了方便起见,只写了一个人类工厂HumanFactory,并实现了它的createHuman(Class<T>)功能。

    然后就是God了,上帝通过AbstractHumanFactory(抽象工厂)创造人类,上帝只要对这个抽象工厂说,我要造一个黄种人的儿童,那么我们在main方法中就可以把上帝的AbstractHumanFactory成员,实例化成儿童工厂,再通过这个儿童工厂去造一个黄种人。

    由此可见,工厂模式实际上就是让上层方便管理下层,一级级下去,每一层负责实现自己的功能就行了。

3.工厂模式的实现:

Human和它的实现类

//方便起见,把相关功能的类放在同一个代码块中
public interface Human {

    void run();
    void speak();
}

public class BlackHuman implements Human{

    @Override
    public void run() {
        System.out.println("black run");
    }

    @Override
    public void speak() {
        System.out.println("black run");
    }
}

public class YellowHuman implements Human{
    @Override
    public void run() {
        System.out.println("yellow run");
    }

    @Override
    public void speak() {
        System.out.println("yellow speak");
    }
}

工厂和它的实现类

public abstract class AbstractHumanFactory {

    public abstract <T extends Human> T createHuman(Class<T> t);
}


public class HumanFactory extends AbstractHumanFactory{
    @Override
    public <T extends Human> T createHuman(Class<T> clazz) {

        if(clazz == YellowHuman.class){
            return (T) new YellowHuman();
        }else if (clazz == BlackHuman.class){
            return (T) new BlackHuman();
        }else {
            throw new RuntimeException("不支持的人种类型");
        }

    }
}

God和Main方法

public class God {

    private AbstractHumanFactory humanFactory;

    public God(AbstractHumanFactory humanFactory) {
        this.humanFactory = humanFactory;
    }

    public AbstractHumanFactory getHumanFactory() {
        return humanFactory;
    }
}




public class Main {

    public static void main(String[] args) {
        AbstractHumanFactory humanFactory = new HumanFactory();
        God god = new God(humanFactory);
        //通过工厂创建人
        YellowHuman human = god.getHumanFactory().createHuman(YellowHuman.class);
        human.run();
        human.speak();
    }
}

    以上就是通过工厂模式来创建对象,当然也可以直接new 对象,但是在大型框架中,为了方便管理,还是会使用工厂模式。

 

转载于:https://my.oschina.net/u/3582320/blog/1154238

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值