工厂模式就是建立一个工厂类,对实现了同一接口的一些类进行实例的创建,将创建对象的过程交给工厂类(我们举一个发送邮件和短信的例子):

模式名称 优点   缺点 使用场景
简单工厂模式 外界不需要创建对象,只需要消费即可 工违反了高内聚责任分配原则,如果需要添加新的类,则就需要改变工厂类了。

①工厂类负责创建的对象比较少

②客户只知道传入工厂类的参数,对于如何创建对象(逻辑)不关心

工厂方法模式  新增产品,不需要改动之前工厂类,只需新增工厂类 实现多个产品接口时,难以处理  日志记录器
抽象工厂模式

 当一个产品族中的多个对象被设计成一起工作时,

它能保证客户端始终只使用同一个产品族中的对象。

 扩展非常困难

 1、QQ 换皮肤,一整套一起换。

 2、生成不同操作系统的程序

 

 

 

 

 

 

 

 

 

 

 

首先定义一个接口类Sender,并创建2个实现类实现Sender接口,代码如下:

public interface Sender {
    void Send();
}

// 邮件发送
public class MailSender implements Sender {
    public void Send() {
        System.out.println("this is MailSender");
    }
}

// 短信发送
public class SmsSender implements Sender {
    public void Send() {
        System.out.println("this is SmsSender");
    }
}

简单工厂模式:创建工厂类ManySendFactory

①普通简单工厂模式:

public class SendFactory {
    // 根据传入类型,去获取对应的实列
    public Sender getSender(String type) {
        if ("mail".equals(type)) {
            return new MailSender();
        } else if ("sms".equals(type)) {
            return new SmsSender();
        }
        return null;
    }
}
//使用方法:
SendFactory factory = new SendFactory(); //创建工厂类
Sender sender = factory.getSender("sms"); // 根据类型获取对应实列
sender.Send();

②多方法简单工厂模式:在普通工厂方法模式中,如果传递的类型出错,则不能正确创建对象,而多个工厂方法模式是提供多个工厂方法,分别创建对象。

public class ManySendFactory {

    public Sender getMailSender() {

        return new MailSender();
    }

    public  Sender getSmsSender() {

        return new SmsSender();
    }
}

// 测试
ManySendFactory manySendFactory = new ManySendFactory();
Sender mailSender = manySendFactory.getMailSender();
mailSender.Send();

 

③静态方法简单工厂模式:讲多方法模式中的所有方法改成静态的,方便调用

public class StaticSendFactory {

    public static Sender getMailSender() {

        return new MailSender();
    }

    public static Sender getSmsSender() {

        return new SmsSender();
    }
}
// 测试
Sender smsSender = StaticSendFactory.getSmsSender();
smsSender.Send();

工厂方法模式:新增工厂接口Factory,并创建SenderFactory和SmsFactory实现Factory接口,通过指定factory类型去创建(该模式是抽象工厂模式的一种特列)

// Factory接口
public interface Factory {

    Sender createSender();
}

// SmsFactory实现Fatory
public class SmsFactory implements Factory {

    @Override
    public Sender createSender() {
        return new SmsSender();
    }
}

// EmailFactory实现Fatory
public class EmailFactory implements Factory {

    @Override
    public Sender createSender() {
        return new EmailSender();
    }
}

 

 测试:根据指定不同工厂获取对应对象

 

  public static void main(String[] args) {
        Factory factory = new SmsFactory();
        factory.createSender().Sender(); // 输出this is SmsSender
        
        Factory factory1 = new EmailFactory();
        factory1.createSender().Sender();// 输出this is EmailSender
    }

抽象工厂模式:围绕一个超级工厂创建其他工厂。该超级工厂又称为其他工厂的工厂。

  ①将多个工厂类抽象出一个抽象类

  ②每个工厂类继承该抽象类

  ③创建一个工厂创造器/生成器类,通过传入类型去获取对应工厂方法,再通过获取出的工厂类获取实列对象。

  

posted on 2020-09-10 15:22  蓝色恋人  阅读(207)  评论(0编辑  收藏  举报