You do not typically use the BeanFactory directly. You use the ApplicationContext.
Read here:
http://static.springsource.org/spring/docs/3.1.x/spring-framework-reference/html/beans.html#beans-beanfactory
Read here for more info on the lazy initialization.
http://static.springsource.org/spring/docs/3.1.x/spring-framework-reference/html/beans.html#beans-factory-lazy-init
Also the pull model your are talking about with getBean() is rarely used. It tightly couples your application code to the framework and defeats the purpose of DI. The usual case where you will see this is in a stand-alone application in the main method. You must get a Spring managed bean from the context to start things, but after that
you should be letting Spring inject the dependencies rather than pulling them in.
To your question BeanFactory is an implementation of the Factory design pattern.
As was stated BeanFactory itself is an interface. The implementations of course differ from each other in a number of ways but generally speaking it will instantiate, configure and manage the life cycle of the beans. It loads the bean definitions immediately but depending may not instantiate them until they are requested.
Understanding all the intricacies is not a requirement for using the Spring Framework as by and large its handled for you, and as I said most of the time your application is unaware of bean factories or application contexts.