Challenge: Solution Review
This lesson will explain the solution to the problem from the last coding challenge.
We'll cover the following
Solution #
class Dress{constructor(serialNumber,type,color,designer,availability){this.serialNumber = serialNumberthis.type = typethis.color = colorthis.designer = designerthis.availability = availabilitythis.price = 0}dressPrice(){if(this.type == "maxi"){this.price = 1000}if(this.type == "gown"){this.price = 2000}if(this.type = "skirt"){this.price = 500}return this.price}}class DressFactory {constructor() {this.existingDresses = {}}createDress(serialNumber,type,color, designer, availability) {var exists = this.existingDresses[serialNumber]if (!!exists) {return this.existingDresses[serialNumber]}else {var dress = new Dress(serialNumber,type,color, designer, availability)this.existingDresses[serialNumber]= dressreturn dress}}}const factory = new DressFactory()const pinkdress1 = factory.createDress("#123","skirt","pink","Zara","yes")const pinkdress2 = factory.createDress("#123","skirt","pink","Zara","yes")console.log(pinkdress1 === pinkdress2)console.log(pinkdress1.dressPrice())console.log(pinkdress2.dressPrice())
Explanation
As explained in the problem statement, we need to implement a functionality that doesn’t allow dresses with the same serialNumber
to be made more than once. For this purpose, a flyweight factory can be used. Before we get into that, let’s look into the Dress
class first.
class Dress{
constructor(serialNumber,type,color,designer,availability){
this.serialNumber = serialNumber
this.type = type
this.color = color
this.designer = designer
this.availability = availability
this.price = 0
}
//code...
}
A Dress
instance contains the properties:
serialNumber
(a unique ID), a type
(maxi, gown, or skirt), color
, the designer
who made the dress, its availability
, and price
.
The price
is initialized to 0
as it is set later on using the dressPrice
function. Let’s look into its implementation:
dressPrice(){
if(this.type == "maxi"){
this.price = 1000
}
if(this.type == "gown"){
this.price = 2000
}
if(this.type = "skirt"){
this.price = 500
}
return this.price
}
Depending on the dress, we set the price equal to the price mentioned in the question and return it.
The next step is to set up a flyweight factory that monitors the number of dresses made corresponding to a serialNumber
. We start by defining a class DressFactory
.
class DressFactory{
constructor() {
this.existingDresses = {}
}
//code....
}
Since it is a factory that produces a lot of dresses, in its constructor
, we initialize a variable existingDresses
, that will store all the unique dresses made.
Next, we define the createDress
function, which is responsible for monitoring the dress creation process.
class DressFactory{
//code....
createDress(serialNumber,type,color, designer, availability) {
var exists;
exists = this.existingDresses[serialNumber]
if (!!exists) {
return this.existingDresses[serialNumber]
}
else {
var dress = new Dress(serialNumber,type,color, designer, availability)
this.existingDresses[serialNumber]= dress
return dress
}
}
}
The function accepts as parameters all the properties of a dress: serialNumber
, type
, color
, designer
, availability
. Whenever a request to create a dress is invoked, the function first checks whether such a dress already exists or not. If not, it creates a new Dress
instance, adds it to the list of existingDresses
, and then returns it. In case an instance already exists, it is returned.
As you can see, if the same dress is instantiated twice, a new object is not created the second time.
console.log(pinkdress1 === pinkdress2) //true
Hence, the DressFactory
prevents unnecessary clutter of objects. The Dress
instance acts as our flyweight object containing the intrinsic information such as the dressPrice
function.
Let’s discuss the proxy pattern in the next lesson.