Well yes, it would need a public method - but it would be the same public method used to construct the target object. Here's a simple example to illustrate.
Create a new project with a form and add a command button to it. Add two empty classes, one called adder and one called factory.
Drop the following code into the factory class:
[tt]
' Simple factory class
Option Explicit
Public Function GetAdder(A As Long, B As Long, Optional C As Long) As Adder
Dim FactoryObject As Adder
Set GetAdder = New Adder
GetAdder.A = A
GetAdder.B = B
GetAdder.C = C
End Function
[/tt]
Drop the following into the adder class:
[tt]
' Example Adder class
Option Explicit
Private mvarA As Long
Private mvarB As Long
Private mvarC As Long
Public Function AddThem() As Long
AddThem = mvarA + mvarB + mvarC
End Function
Public Property Let C(ByVal vData As Long)
mvarC = vData
End Property
Public Property Get C() As Long
C = mvarC
End Property
Public Property Let B(ByVal vData As Long)
mvarB = vData
End Property
Public Property Get B() As Long
B = mvarB
End Property
Public Property Let A(ByVal vData As Long)
mvarA = vData
End Property
Public Property Get A() As Long
A = mvarA
End Property
[/tt]
Finally drop the following code into the form module:
[tt]
Option Explicit
Private Sub Command1_Click()
Dim myFactory As Factory
Dim myAdder As Adder
' Create a new object normally
Set myAdder = New Adder
MsgBox "Result with normal construction: " & myAdder.AddThem
' Create a new object via factory
Set myFactory = New Factory
Set myAdder = myFactory.GetAdder(3, 5, 2) ' Construct and initialise
MsgBox "Result with factory construction: " & myAdder.AddThem
End Sub
[/tt]