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

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

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接口,无需去改动原有的代码。这样做的目的是拓展性较好!

你可能感兴趣的:(工厂方法模式和抽象工厂模式学习笔记)