I'm using a factory class to create instances of another class, say the Product class.
How do I set private variables within the Product class from the factory class? Should I even be doing so?
What I'm planning to do is to public setter methods and then freezing or locking the instance once I have finished with it. But I get the feeling this is the Wrong Way to do things.
How would you approach such a problem?
EDIT:
Yes I would like to use @derekerdmann's method of immutable objects. But I probably should give more info first.
I am writing a parser in php for an HTML-like language so you get nodes, which in turn can contain other nodes. So the factory is a parser producing a hierarchy of nodes. If you are curious here is the code http://http://bazaar.launchpad.net/~rhlee/band-parser/dev/view/head:/src/bands.php
The thing is that I don't know what the child nodes will be until I walk down the rest of the document. So I can't pass then to the constructor.
Sometimes I think that even though I want it to be read only after parsing, why should it be? I take for example php's DOMDocument parser. You can parse a HTML file, and then still modify the structure. However this is so that you can reproduce the HTML after again with the new changes. My parser is a one-way parser, so the need to edit the structure after parsing is non-existent.
The typical way to do this is to create immutable objects. In an immutable object, all private fields are set by passing values into the object's constructor. Immutable == unmodifiable.
If you do need a way to change the private fields, the setter methods would actually create a new instance with the changed fields.
An example Java class:
class ImmutableDuck {
private final String name;
private final int age;
/**
* Constructor - sets the read-only attributes of the duck
*/
public ImmutableDuck( String name, int age ){
this.name = name;
this.age = age;
}
public String getName(){
return name;
}
public int getAge(){
return age;
}
/**
* Creates a new ImmutableDuck with the current object's age
* and the given age
*/
public ImmutableDuck setName( String name ){
return new ImmutableDuck( name, age );
}
}
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With