工厂设计模式

本文章,摘抄自:2018黑马程序最新面试题汇总

工厂模式分为:工厂方法模式和抽象工厂模式。

工厂方法模式分为三种:

普通工厂模式:就是建立一个工厂类,对实现了同一接口的一些类进行实例的创建。

多个工厂方法模式:是对普通工厂方法模式的改进,在普通工厂方法模式中,如果传递的字符串出错,则不能正确创建对象,而多个工厂方法模式是提供多个工厂方法,分别创建对象。

静态工厂方法模式:将上面的多个工厂方法模式里的方法置为静态的,不需要创建实例,直接调用即可。

普通工厂模式:

1 public interface ISender {
2 
3     public void Send();
4 }
1 public class MailSender implements ISender {
2 
3     @Override
4     public void Send() {
5         System.out.println("this is mail sender");
6     }
7 
8 }
1 public class SmsSender implements ISender {
2 
3     @Override
4     public void Send() {
5         System.out.println("this is sms sender");
6     }
7 
8 }
 1 public class SendFactoryCommon {
 2     public ISender produce(String type) {
 3         if ("mail".equals(type)) {
 4             return new MailSender();
 5         } else if ("sms".equals(type)) {
 6             return new SmsSender();
 7         } else {
 8             System.out.println("请输入正确的类型!");
 9             return null;
10         }
11     }
12 }

测试方法:

1 @Test
2     public void testCommon() {
3         SendFactoryCommon factory = new SendFactoryCommon();
4         ISender sender = factory.produce("mail");
5         sender.Send();
6     }

多工厂方法模式:该模式是对普通工厂方法模式的改进,在普通工厂方法模式中,如果传递的字符串出错,则不能正确创建对象,而多个工厂方法模式是提供多个工厂方法,分别创建对象。

import cn.silence.face.designmode.factory.common.ISender;
import cn.silence.face.designmode.factory.common.MailSender;
import cn.silence.face.designmode.factory.common.SmsSender;

public class SendFactoryMore {
    public ISender produceMail() {
        return new MailSender();
    }

    public ISender produceSms() {
        return new SmsSender();
    }
}

测试方法:

1 @Test
2     public void testMore() {
3         SendFactoryMore factory = new SendFactoryMore();
4         ISender sender = factory.produceMail();
5         sender.Send();
6     }

静态工厂方法模式:将上面的多个工厂方法模式里的方法置为静态的,不需要创建实例,直接调用即可。

 1 import cn.silence.face.designmode.factory.common.ISender;
 2 import cn.silence.face.designmode.factory.common.MailSender;
 3 import cn.silence.face.designmode.factory.common.SmsSender;
 4 
 5 public class SendFactoryDyanmic {
 6     public static ISender produceMail() {
 7         return new MailSender();
 8     }
 9 
10     public static ISender produceSms() {
11         return new SmsSender();
12     }
13 }

测试方法:

1 @Test
2     public void testDyanmic() {
3         ISender sender = SendFactoryDyanmic.produceMail();
4         sender.Send();
5     }

抽象工厂模式:工厂方法模式有一个问题就是,类的创建依赖工厂类,也就是说,如果想要拓展程序,必须对工厂类进行修改,这违背了闭包原则,所以,从设计角度考虑,有一定的问题,如何解决?就用到抽象工厂模式,创建多个工厂

类,这样一旦需要增加新的功能,直接增加新的工厂类就可以了,不需要修改之前的代码。

1 import cn.silence.face.designmode.factory.common.ISender;
2 
3 public interface IProvider {
4     public ISender produce();
5 }
 1 import cn.silence.face.designmode.factory.common.ISender;
 2 import cn.silence.face.designmode.factory.common.MailSender;
 3 
 4 public class SendMailFactory implements IProvider {
 5 
 6     @Override
 7     public ISender produce() {
 8         return new MailSender();
 9     }
10 
11 }
 1 import cn.silence.face.designmode.factory.common.ISender;
 2 import cn.silence.face.designmode.factory.common.SmsSender;
 3 
 4 public class SendSmsFactory implements IProvider {
 5 
 6     @Override
 7     public ISender produce() {
 8         return new SmsSender();
 9     }
10 
11 }

测试方法:

1 @Test
2     public void testAbs() {
3         IProvider provider = new SendMailFactory();
4         ISender sender = provider.produce();
5         sender.Send();
6     }
原文地址:https://www.cnblogs.com/ffeiyang/p/9542538.html