设计模式篇—常用设计模式—工厂模式

简单工厂+工厂方法+抽象工厂

工厂模式简介

工厂模式理论我不长篇大论了。其核心功能是根据“需求”生产“产品”,设计模式的核心是解耦,工厂模式就是为了解耦“需求”和“产品”,但是别忘了,工厂模式工,还有一个重要元素,就是“工厂”,所以工厂模式的核心思想,就是解耦“需求”“工厂”和“产品”。

工厂模式,实际上也会根据业务情景不同会有不同的实现方式。一般分为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();
	}
}

发布了234 篇原创文章 · 获赞 12 · 访问量 3万+

猜你喜欢

转载自blog.csdn.net/Coder_Boy_/article/details/84728789