美文网首页java技术学习Java学习笔记
工厂方法模式和抽象工厂模式学习笔记

工厂方法模式和抽象工厂模式学习笔记

作者: 追星星的少年 | 来源:发表于2016-06-22 11:09 被阅读41次

今天实际用代码走了一遍工厂方法模式,抽象工厂模式的思想和玩法,略有些心得,记录一下。

1.工厂方法模式

工厂方法模式(英语:Factory method pattern)是一种实现了“工厂”概念的面向对象设计模式。就像其他创建型模式一样,它也是处理在不指定对象具体类型的情况下创建对象的问题。工厂方法模式的实质是“定义一个创建对象的接口,但让实现这个接口的类来决定实例化哪个类。工厂方法让类的实例化推迟到子类中进行。”(来自维基百科)
代码如下:
公共接口

public interface Sender {
 public void send();
}

邮件实现类

public class MailSender implements Sender{
 @Override
 public void send() {
  System.out.println("邮件发送短信");
 }
}

短信实现类

public class SmsSender implements Sender{
 @Override
 public void send() {
  // TODO Auto-generated method stub
  System.out.println("调用发送短信的方法");
 }
}

构建工厂类

public class SendFactory {

 public Sender produce(String type){
  if("sms".equals(type)){
   return new SmsSender();
  }else if("mail".equals(type)){
   return new MailSender();
  }else{
   System.out.println("请输入正确的类型");
   return null;
  }
 }
 
 //改进的工厂模式,不依赖于传参
 public Sender produceSms(){
  return new SmsSender();
 }

 public Sender produceMail(){
  return new MailSender();
 }
 
 
 //静态工厂模式、
 public static Sender produceSms2 (){
  return new SmsSender();
 }
 
 public static Sender produceMail2(){
  return new MailSender();
 }
 
}```
测试类

public class SenderFactoryTest {

public static void main(String[] args){
SendFactory sendFactory = new SendFactory();
//Sender send = sendFactory.produce("mail");
//send.send();
Sender send = sendFactory.produceMail();
send.send();

//调用静态方法
Sender send2 = SendFactory.produceMail2();
send2.send();
}
}

关于工厂模式总结:当我们需要大量创建某一类产品时,并且具有共同的接口,可以通过工厂模式进行创建。
# 2抽象工厂模式
**抽象工厂模式**(英语:**Abstract factory pattern**)是一种软件开发[设计模式](https://zh.wikipedia.org/wiki/%E8%AE%BE%E8%AE%A1%E6%A8%A1%E5%BC%8F_(%E8%AE%A1%E7%AE%97%E6%9C%BA))。抽象工厂模式提供了一种方式,可以将一组具有同一主题的单独的[工厂](https://zh.wikipedia.org/wiki/%E5%B7%A5%E5%8E%82%E6%96%B9%E6%B3%95)封装起来。在正常使用中,客户端程序需要创建抽象工厂的具体实现,然后使用抽象工厂作为[接口](https://zh.wikipedia.org/w/index.php?title=%E6%8E%A5%E5%8F%A3_(%E8%B5%84%E8%AE%AF%E7%A7%91%E6%8A%80)&action=edit&redlink=1)来创建这一主题的具体对象。客户端程序不需要知道(或关心)它从这些内部的工厂方法中获得对象的具体类型,因为客户端程序仅使用这些对象的通用接口。抽象工厂模式将一组对象的实现细节与他们的一般使用分离开来。

代码实现:

public interface Sender {
public void send();
}

两个实现类

public class MailSender implements Sender{
@Override
public void send() {
// TODO Auto-generated method stub
System.out.println(" mail send ");
}
}

public class SmsSender implements Sender{

@Override
public void send() {
// TODO Auto-generated method stub
System.out.println("sms send");
}

}

再提供一个接口

public interface Provider {

public Sender produce();
}

两个工厂类

public class MailSenderFactory implements Provider {

@Override
public Sender produce() {
// TODO Auto-generated method stub
return new MailSender();
}

}

public class SmsSenderFactory implements Provider {

@Override
public Sender produce() {
// TODO Auto-generated method stub
return new SmsSender();
}

}

测试

public class Test {

public static void main(String [] args){
Provider provider = new SmsSenderFactory();
Sender send = provider.produce();
send.send();

Provider pro = new MailSenderFactory();
pro.produce().send();
}
}

这个模式的好处是,如果你现在想增加一个新功能:发及时信息,则只需做一个实现类,实现Sender接口,同时做一个工厂类,实现Provider接口,无需去改动原有的代码。这样做的目的是拓展性较好!

相关文章

  • 设计模式-工厂模式

    工厂模式概念 实例化对象,用工厂方法代替new操作。工厂模式包括工厂方法模式和抽象工厂模式。抽象工厂模式是工厂模式...

  • 2021-11-16 - 学习记录

    设计模式学习:创建型:工厂(工厂方法,抽象工厂),建造者,单例,原型 设计模式:工厂模式 简单工厂 工厂方法 抽象工厂

  • 设计模式(3) 抽象工厂模式

    抽象工厂模式 优化抽象工厂 异步工厂 在学习抽象工厂模式前,先来回顾一下前面的简单工厂和工厂方法模式。简单工厂的职...

  • 抽象工厂模式(选择产品簇)

    目录 回顾众多工厂模式 抽象工厂模式的理念 抽象工厂模式与工厂方法模式的差异 怎么来实现抽象工厂模式 抽象工厂模式...

  • 1: 简单工厂模式

    一. 基本概念 定义 实例化对象,用工厂方法代替new操作 工厂模式包括工厂方法模式和抽象工厂模式 抽象工厂模式是...

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

    前面我们学习了了简单工厂模式和工厂方法模式,今天我们来学习设计模式中最后的一种工厂模式——抽象工厂模式(Abstr...

  • 设计模式之——工厂模式

    前言:本文仅作为第一次学习设计模式的参考和笔记。初探工厂模式&抽象工厂模式: 工厂模式:Factory Patte...

  • PHP-浅谈单例模式和工厂模式

    PHP中常用的设计模式有单例模式、工厂模式(简单工厂模式、工厂方法模式和抽象工厂方法模式)、适配模式、策略模式。 ...

  • 第一章2.0工厂- 基础类准备

    2.1工厂-简单工厂模式2.2工厂-工厂方法模式2.3工厂-抽象工厂模式

  • 工厂模式(Factory Pattern)

    概述 工厂模式(Factory Pattern)包括简单工厂模式、工厂方法模式和抽象工厂模式,是 Java 中最常...

网友评论

    本文标题:工厂方法模式和抽象工厂模式学习笔记

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