Wednesday, March 2, 2016

[design pattern] Factory

Java 

Abstract Class Animal{
        private String name ;
        //getter&setter
        public void sound();
}

class Dog extends Animal{
        @override
        public void sound(){
                    System.out.println(this.getName()+" wan!wan!");
        }
        public void run(){
                    System.out.println(this.getName()+" runs");
        }
}

class Bird extends Animal{
       @override
        public void sound(){
                    System.out.println(this.getName()+" Ah!Ah!");
        }
        public void fly(){
                    System.out.println(this.getName()+" flies");
        }
}


class AnimalStaticMethodFactory{
        public static Animal makeDog(String name){
                    Animal dog = new Dog();
                    dog.setName (name);
                    return dog;
        }

        public static Animal makeBird(String name){
                    Animal bird = new Bird();
                    bird.setName (name);
                    return bird;
        } }

class AnimalStaticFactory{
        public static Animal makeAnimal(String animalType, String name){
                     Animal animal = null;
                     if("dog".equals(animalType)) {
                           animal = new Dog();
                     }else if("bird".equals(animalType)){
                           animal = new Bird();
                     }
                    dog.setName (name);
                    return animal;
             }
}

C++

class Animal{
public:
         virtual void sound()=0;
         void getName(){return _name;};
         void setName(){return _name;};
private:
         string _name;
}

class Dog:public Animal{
public:
         virtual void sound() override{cout<<"wan!wan!"<<endl;};
         void run(){...};
}

class Bird:public Animal{
public:
         virtual void sound() override{cout<<"Ah!Ah!"<<endl;};
         void fly(){...};
}

class AnimalFactory{
public:
        static sharedPtr<Animal> makeAnimal(const string& type,const string& name){
                    Animal* animal = NULL;
                    if("dog"==type){
                                 animal = new Dog();                               
                    }else if ("bird"==type){
                                 animal = new Bird();   
                    }
                    animal->setName(name); 
                    return sharedPtr<Animal>(animal);
        }
}


No comments:

Post a Comment