Java Design Pattern

本贴最后更新于 2845 天前,其中的信息可能已经时移世易

Factory Design Pattern

工厂模式,简单来描述就是 ,一个类拥有类似工厂的生产模式,根据用户的要求,返回指定的类型。我们用一个Dog的示例来描述

Interface Dog

public interface Dog{
    void speak();
}

Poodle Dog

public class  Poodle implements Dog{

    @overview
    public void speak(){
        sout("poodle say:wrf!");
    }
}

Rottweiler Dog

public class Rottweiler implements Dog{
    @overview
    public void speak(){
        sout("rottweiler say loudly:woof!");
    }
}

Factory Class

//factory to make dog
public class DogFactory{
    //get dog by type ,param [type] dog type
    public static Dog getDog(DogTypeEnum type)throws Exception{
        Dog dog = null;
        switch(type){
            case POODLE:
                dog=new Poodler();
            break;
            case ROTTWEILER:
                dog = new Rottweiler();
            break;
            default:
            throw new RuntimeException("unkonwn dog type!"); 
        }
        return dog;
    }
}

如此,通过工厂类,构建 Dog 对象是,根据不同的 DogTypeEnum 值,可以得到的对象实力不同,即简单的工厂设计模式。

顺便补充一下,工厂模式常用的场景例如 WEB 开发中需要的 SmsSender 、MailSender 的编写,需要为多种短信运营商或者邮箱类型提供不同的 Sender 对象时可用。具体参照各自的项目。

Abstract Factory Mode

抽象工厂模式,抽象工厂可以理解为工厂的工厂。抽象工厂类生产的对象即为工厂。可以将之理解为Factory Producer.
延续上一章节的demo,我们假设(现实中不一定存在这样的情况),每一种dog都有自己的毛发颜色,因此,为了这个颜色,我们构建一个工厂类ColorFactory,用于生产颜色。

//颜色接口
public interface Color{
    void getColor(){};
}

public class Blue implements Color{

    @overview
    public void getColor(){
        sout("color filled:Blue()");
    }
}

public class Red implements Color{

    @overview
    public void getColor(){
        sout("color filled:Red()");
    }
}

public class Green implements Color{

    @overview
    public void getColor(){
        sout("color filled:Green()");
    }
}

//颜色工厂类
public class ColorFactory{
    //获取颜色,简单描述为直接构建实例并调用getColor()方法
    public static Color getColor(ColorTypeEnum type){
        switch(type){
        case blue:
            return new Blue().getColor();
            break;
        case red:
            return new Red().getColor();
            break;
        case green:
            return new Green().getColor();
            break;
        default:
            return null;
        }
    }
}

那么,现在我们具有了两个工厂,一个是 DogFactory ,一个是 ColorFactory.那么我们如何组建一个抽象工厂来实现,每只狗有自己对应的肤色呢?那就让我们来构建一个抽象工厂类。

//抽象工厂类,用于提供指定的对象接口
public abstract AbstractFactory{
    abstract Dog getDog(DogTypeEnum type);
    abstract Color getColor(ColorTypeEnum type);
}

//分别让两个工厂 继承这个抽象工厂类

public class DogFactory extends AbstractFactory {
    @overview
    public Dog getDog(DogTypeEnum type)throws Exception{
        Dog dog = null;
        switch(type){
            case POODLE:
                dog=new Poodler();
            break;
            case ROTTWEILER:
                dog = new Rottweiler();
            break;
            default:
            throw new RuntimeException("unkonwn dog type!"); 
        }
        return dog;
    }
    @overview
    public Color getColor(ColorTypeEnum type){
        return null;
    }
}

public class ColorFactory{
    //获取颜色,简单描述为直接构建实例并调用getColor()方法
    @overview
    public Color getColor(ColorTypeEnum type){
        switch(type){
        case blue:
            return new Blue().getColor();
            break;
        case red:
            return new Red().getColor();
            break;
        case green:
            return new Green().getColor();
            break;
        default:
            return null;
        }
    }

    public Dog getDog(DogTypeEnum type){
        return null;
    }
}

此时我们将两个工厂类相对的统一了。那么我们这时可以提供一个统一的工厂生产类,FactoryProducer

public class FactoryProducer{
    public AbstractFactory getFactory(FactoryTypeEnum type){
        AbstractFactory factory = null;
        switch(type){
        case dog:
            factory  = new DogFactory();
            break;
        case color:
            factory = new ColorFactory();
            break;
        default:
            //null
        }
        return factory;
    }
}

由此,统一了工厂的生产类。此时你可以通过 getFactory();并调用对应的 getDog()或者 getColor()方法获取对象实例,不同的狗狗拥有不同的肤色。就好像 QQ 的皮肤一样,一换可以换一整套

  • 工厂模式
    6 引用
  • 设计模式

    设计模式(Design pattern)代表了最佳的实践,通常被有经验的面向对象的软件开发人员所采用。设计模式是软件开发人员在软件开发过程中面临的一般问题的解决方案。这些解决方案是众多软件开发人员经过相当长的一段时间的试验和错误总结出来的。

    200 引用 • 120 回帖 • 1 关注
  • Java

    Java 是一种可以撰写跨平台应用软件的面向对象的程序设计语言,是由 Sun Microsystems 公司于 1995 年 5 月推出的。Java 技术具有卓越的通用性、高效性、平台移植性和安全性。

    3187 引用 • 8213 回帖

相关帖子

欢迎来到这里!

我们正在构建一个小众社区,大家在这里相互信任,以平等 • 自由 • 奔放的价值观进行分享交流。最终,希望大家能够找到与自己志同道合的伙伴,共同成长。

注册 关于
请输入回帖内容 ...