工厂模式简介
工厂模式理论我不长篇大论了。其核心功能是根据“需求”生产“产品”,设计模式的核心是解耦,工厂模式就是为了解耦“需求”和“产品”,但是别忘了,工厂模式工,还有一个重要元素,就是“工厂”,所以工厂模式的核心思想,就是解耦“需求”“工厂”和“产品”。
工厂模式,实际上也会根据业务情景不同会有不同的实现方式。一般分为3种。简单工厂,工厂方法和抽象工厂。顾名思义,这三种从简单到抽象,名称越来越高大上,实现方式肯定是越来越复杂,所以,我们可以得到第一个结论,三种工厂的实现是越来越复杂的。
工厂模式用于对象的创建,使得客户从具体的产品对象中被解耦。
演示案例工程目录结构:
在演示工厂模式创建对象之前,我们演示下如果不用工厂模式下一般会如何创建对象:
具体实现代码:
举一个发送邮件和短信的例子(根据需要调用各种发送服务对象,SMS、Mail、QQ)
首先,创建三者的共同接口:
package com.dk.pattern.creational.factory.natives;
public interface Sender {
//【个人自给自足】 -生产的产品
public void Send();
}
其次,创建实现类:
package com.dk.pattern.creational.factory.natives;
public class SmsSender implements Sender {
@Override
public void Send() {
System.out.println("this is sms sender!");
}
}
package com.dk.pattern.creational.factory.natives;
public class MailSender implements Sender {
@Override
public void Send() {
System.out.println("this is mailsender!");
}
}
package com.dk.pattern.creational.factory.natives;
public class QQSender implements Sender{
@Override
public void Send() {
System.out.println("this is QQsender!");
}
}
需求使用者测试类:
package com.dk.pattern.creational.factory.natives;
public class NativeCreateProduct {
public static void main(String[] args) {
SmsSender sender = new SmsSender();
sender.Send();
}
}
对象的创建与使用都是由需求使用者操作的,导致使用者对创建的对象要足够了解才能使用需要的对象!
如何解决这种对象的创建与使用者之间的紧耦合问题呢?可以使用设计模式中的工厂模式来解决。
我们从简单工厂模式开始演示:
1、简单工厂模式:
首先,简单工厂模式不属于23中涉及模式,简单工厂一般分为:普通简单工厂、多方法简单工厂、静态方法简单工厂。
普通简单工厂
就是建立一个工厂类,对实现了同一接口的一些类进行实例的创建。首先看下关系图:
案例演示目录:
首先,创建产品的共同接口:
package com.dk.pattern.creational.factory.simple.ordinary.product;
public interface Sender {
public void Send();
}
其次,创建实现类:
package com.dk.pattern.creational.factory.simple.ordinary.product;
public class MailSender implements Sender {
@Override
public void Send() {
System.out.println("this is mailsender!");
}
}
package com.dk.pattern.creational.factory.simple.ordinary.product;
public class SmsSender implements Sender {
@Override
public void Send() {
System.out.println("this is sms sender!");
}
}
最后,建工厂类:
package com.dk.pattern.creational.factory.simple.ordinary.factory;
import com.dk.pattern.creational.factory.simple.ordinary.product.MailSender;
import com.dk.pattern.creational.factory.simple.ordinary.product.Sender;
import com.dk.pattern.creational.factory.simple.ordinary.product.SmsSender;
public class SendFactory {
//生产小作坊
public Sender produce(String type) {
if ("mail".equals(type)) {
return new MailSender();
} else if ("sms".equals(type)) {
return new SmsSender();
} else {
System.out.println("请输入正确的类型!");
return null;
}
}
}
测试类:
package com.dk.pattern.creational.factory.simple.ordinary;
import com.dk.pattern.creational.factory.simple.ordinary.factory.SendFactory;
import com.dk.pattern.creational.factory.simple.ordinary.product.Sender;
public class OrdinaryFactoryTest {
public static void main(String[] args) {
SendFactory factory = new SendFactory();
Sender sender = factory.produce("sms");
sender.Send();
}
}