Singletonizer

From APIDesign

(Difference between revisions)
Jump to: navigation, search
(New page: Singletonizer is a simplification of Factory by use of Generics. It is very useful pattern for creating ProviderAPI. On the other hand, it is not that useful for [[ClientAP...)
Line 10: Line 10:
[[Singletonizer]] is useful when dealing with complex graphs of tree hierarchies. One can have an [[ClientAPI]] with a class that represents a [[wikipedia::Graph_Vertex|vertex]] in a graph. Thus having tons of instances and yet, they all can delegate to just one [[Singletonizer]] implementation that handles all their operation. Thus they are basically ''singletonizing'' number of instances to one - hence the name [[Singletonizer]].
[[Singletonizer]] is useful when dealing with complex graphs of tree hierarchies. One can have an [[ClientAPI]] with a class that represents a [[wikipedia::Graph_Vertex|vertex]] in a graph. Thus having tons of instances and yet, they all can delegate to just one [[Singletonizer]] implementation that handles all their operation. Thus they are basically ''singletonizing'' number of instances to one - hence the name [[Singletonizer]].
 +
 +
<comments/>
[[Category:APIDesignPatterns]]
[[Category:APIDesignPatterns]]
[[Category:APIDesignPatterns:Evolution]]
[[Category:APIDesignPatterns:Evolution]]
[[Category:APIDesignPatterns:Accuracy]]
[[Category:APIDesignPatterns:Accuracy]]

Revision as of 16:12, 25 December 2008

Singletonizer is a simplification of Factory by use of Generics. It is very useful pattern for creating ProviderAPI. On the other hand, it is not that useful for ClientAPI, as its use requires an OpenClass concept.

Instead of having one class representing a Factory which creates another class representing the data, one can move all the methods into one class:

Code from Digestor.java:
See the whole file.

public abstract class Digestor<Data> {
   protected abstract byte[] digest(Data data);
   protected abstract Data create(String algorithm); 
   protected abstract void update(Data data, ByteBuffer input);
 
}
 

This simplifies the life for the implementors of the Digestor class while retaining the same power as they had before. They have to subclass and implement just one type. Yet they can also have own data type. Moreover, due to use of Generics they do not need to deal with any casts or unsafe type checking. Or, just like in following example, one can reuse suitable existing data type:

Code from CountingDigestor.java:
See the whole file.

public final class CountingDigestor extends Digestor<int[]> {
    @Override
    protected byte[] digest(int[] data) {
        int i = data[0];
        byte[] arr = { 
            (byte) (i & 255), 
            (byte) ((i >> 8) & 255), 
            (byte) ((i >> 16) & 255), 
            (byte) ((i >> 24) & 255) 
        };
        return arr;
    }
 
    @Override
    protected int[] create(String algorithm) {
        return "cnt".equals(algorithm) ? new int[1] : null;
    }
 
    @Override
    protected void update(int[] data, ByteBuffer input) {
        data[0] += input.remaining();
        input.position(input.position() + input.remaining());
    }
}
 

Singletonizer is useful when dealing with complex graphs of tree hierarchies. One can have an ClientAPI with a class that represents a vertex in a graph. Thus having tons of instances and yet, they all can delegate to just one Singletonizer implementation that handles all their operation. Thus they are basically singletonizing number of instances to one - hence the name Singletonizer.

<comments/>

Personal tools
buy