美文网首页Android知识Android进阶之路Android技术知识
设计模式Java Design Pattern-工厂方法模式Fa

设计模式Java Design Pattern-工厂方法模式Fa

作者: 勇敢写信 | 来源:发表于2018-03-22 17:05 被阅读0次

我的博客

一、 设计模式的分类

大体可以分为三类:

  • 创建型模式(5个)
    单例模式、原型模式、工厂方法模式、抽象工厂模式、建造者模式
  • 结构性模式(7个)
    适配器模式、装饰器模式、代理模式、外观模式、桥接模式、组合模式、享元模式
  • 行为型模式(11个)
    观察者模式、策略模式、模板方法模式、迭代子模式、责任链模式、 命令模式、备忘录模式、状态模式、访问者模式、中介者模式、解释器模式

工厂方法模式

工厂方法分为3类:

  • 普通工厂模式
    创建一个工厂类,对实现了同一个接口的一些类进行实例的创建
    首先我们看一下关系图


    image

首先我们新建一个接口

public interface Sender {
    void send();
}

然后创建实现类

public class EmailSender implements Sender {

    public void send() {
        System.out.println("send a message by Email!!!");
    }
}

public class MessageSender implements Sender {

    public void send() {
        System.out.println("send a message by MessageSender");

    }

}

最后建工厂类

public class SendFactory {
    public Sender produce(String type){
        if("message".equals(type)){
            return new MessageSender();
        }else if("email".equals(type)){
            return new EmailSender();
        }else{
            System.out.println("请输入正确的类型");
            return null;
        }
    }
}

然后我们测试一下:

public class FactoryTest {
public static void main(String[] args) {
     SendFactory factory = new SendFactory();
     Sender sender = factory.produce("email");
     sender.send();
}
}

输出结果

send a message by Email!!!
  • 多个工厂方法模式
    提供多个工厂方法,分别创建对象
    只需要修改工厂类部分代码即可:
public class SendFactory {
    public Sender produceMail(){
        return new EmailSender();
    }
    public Sender produceMessage(){
        return new MessageSender();
    }
}

测试类

public class FactoryTest {
    public static void main(String[] args) {
        SendFactory factory = new SendFactory();
        // Sender sender = factory.produce("email");
        Sender mail = factory.produceMessage();
        mail.send();
    }
}

输出结果

send a message by MessageSender
  • 静态工厂方法
    将工厂类中的方法设置为静态,工厂类不需要创建实例,直接调用方法创建实例
public class SendFactory {
    public static Sender produceMail(){
        return new EmailSender();
    }
    public static Sender produceMessage(){
        return new MessageSender();
    }
}

测试类:

public class FactoryTest {
    public static void main(String[] args) {
        Sender mail = SendFactory.produceMessage();
        mail.send();
    }
}

适用场景:有大量的产品需要创建实例,并且这些类实现了同一个接口

抽象工厂模式

工厂方法模式的一个缺陷是类的创建依赖于工厂类,这就意味着,如果想要拓展程序,需要改工厂类的代码,这就违背了闭包原则。抽象工厂模式就可以解决这个问题。创建多个工厂类,一旦需要添加新功能,只需要添加一个工厂类就行了。


image

一个接口

public interface Provider {
    Sender produce();

}

两个工厂类

public class MessageFactory implements Provider {

    public Sender produce() {
        return new MessageSender();
    }

}
public class MessageSender implements Sender {

    public void send() {
        System.out.println("send a message by MessageSender");

    }

}

测试类

public class FactoryTest {
    public static void main(String[] args) {
        // Sender mail = SendFactory.produceMessage();
        // mail.send();
        MessageFactory messageFactory = new MessageFactory();
        Sender sender = messageFactory.produce();
        sender.send();
    }
}

最后输出

send a message by MessageSender

待续,未完...

相关文章

  • 设计模式Java Design Pattern-工厂方法模式Fa

    我的博客 一、 设计模式的分类 大体可以分为三类: 创建型模式(5个)单例模式、原型模式、工厂方法模式、抽象工厂模...

  • 设计模式之简单工厂、工厂方法、抽象工厂

    设计模式之简单工厂、工厂方法、抽象工厂 什么是设计模式? 设计模式(Design pattern)代表了最佳的实践...

  • 设计模式系列-简单工厂模式

    JAVA设计模式系列: 单例模式 观察者模式 模板方法模式 简单工厂模式 定义 简单工厂模式又叫做静态工厂方法模式...

  • 工厂模式

    java设计模式-工厂模式 工厂模式: 工厂模式是java设计模式里最常用的设计模式之一。 工厂模式属于创建型模式...

  • 设计模式系列-抽象工厂模式

    JAVA设计模式系列: 单例模式 观察者模式 模板方法模式 简单工厂模式 抽象工厂模式 抽象工厂模式 定义 抽象工...

  • 工厂方法模式

    Java23种设计模式--工厂方法模式 一、什么是工厂方法模式 工厂方法模式同样属于类的创建型模式又被称为多态工厂...

  • Java设计模式教程

    Java设计模式教程 Java工厂设计模式 Java抽象工厂模式 Java单例模式 Java建造者(Builder...

  • Java23种设计模式之创建型模式「工厂方法模式」

    工厂方法模式 工厂模式(Factory Pattern)是 Java 中最常用的设计模式之一。这种类型的设计模式属...

  • 简单工厂模式

    Java23种设计模式--简单工厂模式 一、什么是简单工厂模式 简单工厂模式属于类的创建型模式,又叫做静态工厂方法...

  • Java与模式

    《JAVA与模式》之简单工厂模式《JAVA与模式》之工厂方法模式《JAVA与模式》之抽象工厂模式

网友评论

    本文标题:设计模式Java Design Pattern-工厂方法模式Fa

    本文链接:https://www.haomeiwen.com/subject/xzyaqftx.html