[一天一个设计模式]-[工厂模式]

简单工厂模式
简单工厂模式就是把创建对象实例的工作全部交给工厂类,使用方只需要知道自己需要的类的类型。

举个栗子,养宠物,有的人喜欢猫有的人喜欢狗。

public interface Pet{
    void say();
}
public class Cat implements Pet{
    
    @Override
    public void say(){
        System.out.println("I'm cat.");
    } 
}

public class Dog implements Pet{
    
    @Override
    public void say(){
        System.out.println("I'm dog.");
    } 
}

下面我们来创建一个宠物工厂,使用方只需要知道自己想要什么类型即可。

public class PetFactory{
    
    public static Pet createPet(int type){
        if(type==0){
            return new Cat();
        }else if(type == 1){
            return new Dog();
        }else{
            return null;
        }
    }
}
工厂方法模式
当需要创建的实例子类越来越多,简单工厂就会非常臃肿,工厂方法模式把实例的创建放到子工厂中解决了这个问题。

举个栗子,养宠物的人还有喜欢鸟,羊的。。。

public class Bird implements Pet{
    
    @Override
    public void say(){
        System.out.println("I'm bird.");
    } 
}

public class Sheep implements Pet{
    
    @Override
    public void say(){
        System.out.println("I'm sheep.");
    } 
}

public interface IPetFactory{
    Pet createPet();
}

public class BirdFactory implements IPetFactory{
    
    @Override
    public Pet createPet(){
        return new Bird();
    } 
}

public class SheepFactory implements IPetFactory{
    
    @Override
    public Pet createPet(){
        return new Sheep();
    } 
}

调用者只需要实例化需要的工厂即可。

//调用者
main(){
    
    IPetFactory f=new SheepFactory();
    Pet sheep=f.createPet();
    
}

抽象工厂模式
抽象工厂模式就像是前面两种模式的组合,简单工厂是一个工厂类创建所有实例,工厂方法是一类工厂类创建一类实例,抽象工厂模式是一个工厂类可以创建多类实例。

举个栗子,有人不喜欢宠物但是喜欢手机,

public interface Phone{
    void fun();
}

public class IPhone implements Phone{
    
    @Override
    public void fun(){
        sout("I'm iPhone");
    }
}

public class OnePlus implements Phone {
    
    @Override
    public void fun(){
        sout("I'm OnePlus");
    }
}
public interface Factory{
    Pet createPet();
    Phone createPhone(int type);
}
public class SheepPhoneFactory implements Factory {
    
    @Override
    public Pet createPet(){
        return new Sheep();
    }
    
    @Override
    public Phone createPhone(int type){
        if(type == 0 ){
            return new IPone();
        }else{
            return new OnePlus()
        }
    }
}

posted @ 2019-12-12 08:56  A_yes  阅读(105)  评论(0编辑  收藏  举报