美文网首页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

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