工厂设计模式来啦

文章内容输出来源:拉勾教育Java就业集训营;
 
一、概念 

工厂模式,是一种创建对象的模式,这种模式将创建对象的责任转移到工厂类;

工厂类,会对实现了同一接口的不同实现类进行实例的创建。

 
二、分类 
工厂设计模式主要分为:普通工厂模式、多个工厂方法模式、静态工厂方法模式、抽象工厂模式。
 
四、普通工厂模式
1、类图

 2、代码实现

  Sender.java
public interface Sender {
    // 自定义抽象方法来描述发送的行为
    void send();
}
  MailSender.java
public class MailSender implements Sender {
    @Override
    public void send() {
        System.out.println("正在发送邮件...");
    }
}
  SmsSender.java
public class SmsSender implements Sender {
    @Override
    public void send() {
        System.out.println("正在发送短信...");
    }
}
SendFactory.java
public class SendFactory {
    // 自定义成员方法实现对象的创建
    public Sender produce(String type) {
        //System.out.println("随便加一句打印进行测试");
        if ("mail".equals(type)) {
            return new MailSender();
        }
        if ("sms".equals(type)) {
            return new SmsSender();
        }
        return null;
    }
}

 SendFactoryTest.java

public class SendFactoryTest {

    public static void main(String[] args) {

        // 缺点:代码复杂,可读性略差
        // 优点:扩展性和可维护性更强!  尤其是在创建大量对象的前提下
        // 1.声明工厂类类型的引用指向工厂类类型的对象
        SendFactory sf = new SendFactory();
        // 2.调用生产方法来实现对象的创建
        Sender sender = sf.produce("mail");
        //Sender sender = sf.produce("maill");  //多传了l,错误// 3.使用对象调用方法模拟发生的行为
        sender.send();
    }
}

 3、主要缺点

在普通工厂方法模式中,如果传递的字符串出错,则不能正确创建对象,并且可能出现空指针异常

 

五、多个工厂方法模式

 1、类图

2、代码实现

SendFactory.java
public class SendFactory {

    public Sender produceMail() {
        return new MailSender();
    }
    public Sender produceSms() {
        return new SmsSender();
    }
}
SendFactoryTest.java
 
public class SendFactoryTest {

    public static void main(String[] args) {
        // 1.声明工厂类类型的引用指向工厂类类型的对象
        SendFactory sf = new SendFactory();
        // 2.调用生产方法来实现对象的创建
        Sender sender = sf.produceMail();
        // 3.使用对象调用方法模拟发生的行为
        sender.send();
    }
}
3、主要缺点

  在多个工厂方法模式中,为了能够正确创建对象,先需要创建工厂类的对象才能调用工厂类中的生产方法。

 

六、静态工厂方法模式

1、类图
2、代码实现
  SendFactory.java
public class SendFactory {

    public static Sender produceMail() {
        return new MailSender();
    }
    public static Sender produceSms() {
        return new SmsSender();
    }
}
  SendFactoryTest.java
public class SendFactoryTest {

    public static void main(String[] args) {
         // 1.调用生产方法来实现对象的创建
        Sender sender = SendFactory.produceMail();
        // 2.使用对象调用方法模拟发生的行为
        sender.send();
    }
}

3、实际意义

  工厂方法模式适合:凡是出现了大量的产品需要创建且具有共同的接口时,可以通过工厂方法模式进行创建

4、主要缺点
  工厂方法模式有一个问题就是,类的创建依赖工厂类,也就是说,如果想要拓展程序生产新的产品,就必须对工厂类的代码进行修改,这就违背了开闭原则。

 

七、抽象工厂模式

1、类图

 

 

2、代码实现

Provider.java
public interface Provider {
    // 自定义抽象方法描述产品的生产行为
    Sender produce();
}
MailSendFactory.java
public class MailSendFactory implements Provider {
    @Override
    public Sender produce() {
        return new MailSender();
    }
}
SmsSendFactory.java
public class SmsSendFactory implements Provider {
    @Override
    public Sender produce() {
        return new SmsSender();
    }
}
SendFactoryTest.java
public class SendFactoryTest {

    public static void main(String[] args) {
        System.out.println("-------------------------------------");
        Provider provider = new MailSendFactory();
        Sender sender2 = provider.produce();
        sender2.send();
    }
}

3、抽象工厂模式的扩展优势

 

 

PacketSender.java
public class PacketSender implements Sender {
    @Override
    public void send() {
        System.out.println("正在发送包裹...");
    }
}

  PacketSendFactory.java

public class PacketSendFactory implements Provider {
    @Override
    public Sender produce() {
        return new PacketSender();
    }
}
SendFactoryTest.java
public class SendFactoryTest {

    public static void main(String[] args) {
        System.out.println("-------------------------------------");
        Provider provider = new MailSendFactory();
        Sender sender2 = provider.produce();
        sender2.send();

        System.out.println("-------------------------------------");
        Provider provider1 = new PacketSendFactory();
        Sender sender3 = provider1.produce();
        sender3.send();
    }
}

 

 

posted @ 2020-09-27 23:42  格子衫111  阅读(131)  评论(0)    收藏  举报