- Home
- Products
- Integration
- Tutorial
- Barcode FAQ
- Purchase
- Company
Using the Generic Flyweight Architecture in Visual Basic .NET
Using the Generic Flyweight Architecture Denso QR Bar Code Maker In VB.NET Using Barcode encoder for Visual Studio .NET Control to generate, create Quick Response Code image in Visual Studio .NET applications. www.OnBarcode.comQR Decoder In Visual Basic .NET Using Barcode recognizer for .NET Control to read, scan read, scan image in .NET framework applications. www.OnBarcode.comUsing the generic Flyweight pattern implementation isn t complicated and is well suited in a component situation. What is important about using the generic Flyweight pattern implementation is that it should be hidden in the context of a builder. Let s say that the following interface and implementations are instance types that a client is interested in: public interface ITestFlyweight { string Identifier { get; } } class TestFlyweightA : ITestFlyweight { public String Identifier { get { return "TestFlyweightA"; } } } class TestFlyweightB : ITestFlyweight { public String Identifier { get { return "TestFlyweightB"; } } } Print Barcode In Visual Basic .NET Using Barcode creator for .NET Control to generate, create Barcode image in VS .NET applications. www.OnBarcode.comCreating Quick Response Code In Visual Basic .NET Using Barcode printer for Visual Studio .NET Control to generate, create QR Code image in VS .NET applications. www.OnBarcode.comCHAPTER 7 EFFICIENT CODE
Printing UPC Symbol In Visual Basic .NET Using Barcode creation for .NET Control to generate, create UPCA image in Visual Studio .NET applications. www.OnBarcode.comPDF-417 2d Barcode Generation In Visual Basic .NET Using Barcode encoder for .NET framework Control to generate, create PDF 417 image in VS .NET applications. www.OnBarcode.comThe interface ITestFlyweight has a single property, Identifier, that retrieves a property value. In your own solutions, the interface could have as many methods or properties as needed, but the interface needs to be immutable. Additionally, an interface doesn t need to be used; instead you could employ a base class. Or if desired, in the declaration of FlyweightFactory you can include the type object, which allows the referencing of any object instance. In the example, TestFlyweightA and TestFlyweightB both implement the ITestFlyweight interface and a rudimentary implementation of the property Identifier. The following Builder class illustrates a complete Flyweight pattern implementation: class FlyweightBuilder { public static ITestFlyweight Transformation( object desc) { if( String.Compare( (string)desc, "TestFlyweightA") == 0) { return new TestFlyweightA(); } else if( String.Compare( (string)desc, "TestFlyweightB") == 0) { return new TestFlyweightB(); } throw new NotSupportedException(); } public static IFlyweightCollection< ITestFlyweight, string> Instantiate() { return new FlyweightCollection< ITestFlyweight, string>( new DelegateTransformer< string, ITestFlyweight>( FlyweightBuilder.Transformation)); } } FlyweightBuilder has two static methods: Instantiate and Transformation. The method Instantiate instantiates the FlyweightCollection class, where the Generic parameter is defined to be ITestFlyweight. This means that this Flyweight pattern implementation creates objects of type ITestFlyweight. The method Transformation instantiates either TestFlyweightA or TestFlyweightB depending on the value of parameter desc. If desc doesn t resolve to one of the two values, an exception is thrown. ANSI/AIM Code 39 Printer In Visual Basic .NET Using Barcode creator for .NET Control to generate, create Code 3/9 image in VS .NET applications. www.OnBarcode.comCode 93 Maker In VB.NET Using Barcode encoder for .NET Control to generate, create USS Code 93, USS 93 image in VS .NET applications. www.OnBarcode.comUsing the Flyweight Implementation
Denso QR Bar Code Creation In Objective-C Using Barcode generator for iPhone Control to generate, create QR Code image in iPhone applications. www.OnBarcode.comQR Generation In None Using Barcode creation for Word Control to generate, create QR Code ISO/IEC18004 image in Office Word applications. www.OnBarcode.comThe last step in this demonstration of the Flyweight pattern is to have FlyweightBuilder instantiate some types based on a descriptor. Following is the related NUnit test code: [TestFixture] public class TestFlyweight { [Test] public void TestSimple() { IFlyweightCollection< ITestFlyweight, string> var = FlyweightBuilder.Instantiate(); ITestFlyweight var1 = var.GetItem( "TestFlyweightA"); ITestFlyweight var2 = var.GetItem( "TestFlyweightB"); Data Matrix ECC200 Creator In Objective-C Using Barcode creator for iPhone Control to generate, create ECC200 image in iPhone applications. www.OnBarcode.comDecoding Code 128 Code Set C In Java Using Barcode scanner for Java Control to read, scan read, scan image in Java applications. www.OnBarcode.comCHAPTER 7 EFFICIENT CODE
Code 39 Full ASCII Generation In .NET Using Barcode printer for ASP.NET Control to generate, create Code39 image in ASP.NET applications. www.OnBarcode.comEncode Code 128 In Java Using Barcode drawer for BIRT reports Control to generate, create Code 128B image in Eclipse BIRT applications. www.OnBarcode.comAssert.AreEqual( "TestFlyweightA", var1.Identifier); Assert.AreEqual( "TestFlyweightB", var2.Identifier); ITestFlyweight var1a = var.GetItem( "TestFlyweightA"); Assert.IsTrue( Object.ReferenceEquals( var1, var1a)); ITestFlyweight var2a = var.GetItem( "TestFlyweightB"); Assert.IsTrue( Object.ReferenceEquals( var2, var2a)); } } An instance of the IFlyweightCollection<> interface is instantiated using the method FlyweightBuilder.Instantiate. Then the method GetItem is called twice and assigned to the variables var1 and var2. The variable var1 references an instance of TestFlyweightA, and the variable var2 references an instance of TestFlyweightB. The subsequent Assert statements verify that the correct instances are instantiated. The variable var1a uses the same descriptor as was used to assign the variable var1. The Flyweight pattern dictates that both var1 and var1a reference the same object instance. The proof is the validation using the method Object.ReferenceEquals of var1 and var1a; Assert.IsTrue then checks to see whether the method returns a true value. The same test is performed for the variables var2 and var2a. Let s consider the ramifications of this implementation: There is no way to test whether the returned instantiated type is immutable. The Flyweight pattern dictates that it s immutable, but there is no way to verify it. A way to ensure that only immutable objects are used is to periodically check the hashcode of such an object and ensure that it isn t modified. It s possible to use class instances that can be altered. However, that means multiple clients will be manipulating the same object instance. This violates the Flyweight pattern and introduces state corruption, as multiple threads might be manipulating the same data. But if the objects do change, use the hashcode to check for changes and perform some additional action not defined by the illustrated implementation. There has to be a way to describe the objects you re interested in. In the example, the description consisted of a text buffer, but you could also use an enumeration or a configuration file entry. I previously mentioned that the descriptor should implement either the Dynamic or Static Extension pattern because that makes the descriptor definition flexible. A flyweight descriptor can only refer to one unique state. It isn t possible, nor should it be attempted, to switch the meaning of a descriptor while a Flyweight implementation is being used. In other words, combining the Flyweight pattern with the State pattern isn t a good idea. A very good way of implementing the transformation functor is to use the Chain of Responsibility pattern. This gets away from the hard-coded if statement block given by the example. Encode Quick Response Code In Visual C#.NET Using Barcode creator for .NET Control to generate, create QR Code image in .NET applications. www.OnBarcode.comEAN13 Reader In Visual Basic .NET Using Barcode scanner for VS .NET Control to read, scan read, scan image in .NET applications. www.OnBarcode.comPaint UCC - 12 In Objective-C Using Barcode drawer for iPhone Control to generate, create EAN 128 image in iPhone applications. www.OnBarcode.comRead DataMatrix In Java Using Barcode decoder for Java Control to read, scan read, scan image in Java applications. www.OnBarcode.comGS1 - 13 Generator In VS .NET Using Barcode generator for Visual Studio .NET Control to generate, create EAN-13 image in .NET applications. www.OnBarcode.comDecoding Barcode In .NET Framework Using Barcode scanner for .NET Control to read, scan read, scan image in VS .NET applications. www.OnBarcode.com |
|