https://blog.csdn.net/llussize/article/details/80276627
总体来说,工厂模式适合:凡是出现了大量的产品需要创建,并且具有共同的接口时,可以通过工厂方法模式进行创建。在以上的三种模式中,第一种如果传入的字符串有误,不能正确创建对象,第三种相对于第二种,不需要实例化工厂类,所以,大多数情况下,我们会选用第三种——静态工厂方法模式。
单一工厂模式
package org.example.dao;
//单一工厂方法模式
public class SimpleFactory {
public static void main(String[] args) {
SenderFactory senderFactory = new SenderFactory();
Sender sender = senderFactory.product("Sms");
sender.send();
Sender sender2 = senderFactory.product("Mail");
sender2.send();
Sender sender3 = senderFactory.product("sms");
if(sender3==null){
System.out.println("cuowu");
}
}
}
interface Sender{
void send();
}
class MailSender implements Sender{
@Override
public void send() {
System.out.println("Mail send message!");
}
}
class SmsSender implements Sender{
@Override
public void send() {
System.out.println("Sms send message!");
}
}
class SenderFactory{
public Sender product(String str){
if(str.equals("Sms")){
return new SmsSender();
}
else if(str.equals("Mail")){
return new MailSender();
}else {
return null;
}
}
}
多工厂方法模式
package org.example.dao;
//多个工厂方法模式
public class MutilFactory2 {
public static void main(String[] args) {
Factory factory = new Factory();
factory.productMailSender().send();
factory.productSmsSender().send();
}
}
class Factory {
public Sender productMailSender(){
return new MailSender();
}
public Sender productSmsSender(){
return new SmsSender();
}
}
静态工厂方法模式
package org.example.dao;
//静态工厂方法模式
public class StaticFactory3 {
public static void main(String[] args) {
StaticFactory.productMail().send();
StaticFactory.productSms().send();
}
}
class StaticFactory{
public static Sender productMail(){
return new MailSender();
}
public static Sender productSms(){
return new SmsSender();
}
}
抽象工厂方法模式(扩展性好)
这个模式的好处就是,如果你现在想增加一个功能:发及时信息,则只需做一个实现类,实现Sender接口,同时做一个工厂类,实现Provider接口,就OK了,无需去改动现成的代码。这样做,拓展性较好!
package org.example.dao;
//抽象工厂模式
public class AbstractFactory {
public static void main(String[] args) {
Provider provider = new SendMailFactory();
Senderr senderr = provider.product();
senderr.send();
Provider provider2 = new SendSmsFactory();
Senderr senderr2 = provider2.product();
senderr2.send();
}
}
interface Senderr {
void send();
}
class Mail implements Senderr {
@Override
public void send() {
System.out.println("Mail send message!");
}
}
class Sms implements Senderr {
@Override
public void send() {
System.out.println("Sms send message!");
}
}
//提供一个接口
interface Provider {
public Senderr product();
}
//两个工厂类
class SendMailFactory implements Provider {
@Override
public Senderr product() {
return new Mail();
}
}
class SendSmsFactory implements Provider {
@Override
public Senderr product() {
return new Sms();
}
}