zoukankan      html  css  js  c++  java
  • [一天一个设计模式]-[工厂模式]

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

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

    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()
            }
        }
    }
    
    
  • 相关阅读:
    Hadoop整理二(Hadoop分布式存储系统HDFS)
    Hadoop整理一(初识Hadoop)
    Unalignable boolean Series provided as indexer (index of the boolean Series and of the indexed object do not match
    Oracle登录
    神经网络一(用tensorflow搭建简单的神经网络并可视化)
    Qt程序启动画面播放(gif与swf两种动画格式)
    VS2008+GDI实现多幅图像的GIF动画制作
    C++读取特定路径下文件目录及文件名称
    求助——数据处理问题
    VC6.0读取Excel文件数据
  • 原文地址:https://www.cnblogs.com/A-yes/p/12026942.html
Copyright © 2011-2022 走看看