工厂模式
来源:互联网 发布:python pyqt 实例 编辑:程序博客网 时间:2024/05/20 18:19
2、工厂模式
工厂模式专门负责将大量有共同接口的类实例化,工厂模式可以动态决定将哪个类实例化,不必事先知道每次实例化哪个类。
普通工厂模式:类创建型模式,在简单工厂模式中,可以根据自变量的不同返回不同类的实例。简单工厂模式专门定义一个类来负责创建其他类的实例,被创建的实例通常都具有共同的父类。
简单工厂模式优点:工厂类含有必要的判断逻辑,可以决定在什么时候创建哪一个产品类的实例,简单工厂模式通过这种做法实现了对责任的分割,他提供了专门的工厂类用于创建对象;客户端无需知道所创建的具体产品类的类名,只需要知道具体产品类所对应的参数即可,对于一些复杂的类名,通过简单工厂模式减少使用者的记忆力;要通过引入配置文件,可以在不修改任何客户端代码的情况下更换和增加新的产品类,一定程度上提高了系统的灵活度。
适用环境:工厂类负责创建的对象比较少;客户端只知道传入工厂的参数,对于如何创建对象不关心。
2.1简单工厂模式:
public interface Sender{
Public void Send();
}
//具体产品角色
public class MailSender implements Sender{
public void Send(){
System.out.println(“this is mailSender”);
}
}
public class SmsSender implements Sender{
public void Send(){
System.out.println(“this is sms Sender”);
}
}
//工厂类
public class SendFactory{
public Sender produce(String s ){
If(“mail”.equals(s))
return new MailSender();
else if(“sms”.equals(s))
return new SmsSender();
else{
System.our.println(“请输入正确类型”);
return null;
}
}
}
//测试类
public class FactoryTest{
public static void main(Sring[] args){
//获得工厂类
SendFactory factory = new SendFactory();
//获得接口Sender(接口是抽象类的特例,实现接口相当于一种特殊的继承)
//实例化了接口sender,但是不涉及Sender的具体子类(减小耦合),达到封装效果。
Sender sender = factory.produce(“sms”);
sender.Send();
}
}
2.2工厂方法模式:
public classSendFactory{
public static Sender produceMail(){
return new MailSender();
}
public static Sender produceSms(){
return new SmsSender();
}
}
//测试类
public classFactoryTest{
public static void main(String[] args){
Sender sender= SendFactory.produceMail();
sender.Send();
}
}
2.3抽象工厂模式
public interface Sender{
public void Send();
}
//具体产品角色
public class MailSender implements Sender{
public void Send(){
System.out.println(“this is mailSender”);
}
}
public class SmsSender implements Sender{
public void Send(){
System.out.println(“this is sms Sender”);
}
}
public interface Provider{
public Sender produce();
}
//每个具体类都有自己的工厂。produce()方法返回具体类的实例。
public classSendMailFactory implements Provider {
public Sender produce(){
return new MailSender();
}
}
public classSendSmsFactory implements Provider{
public Sender produce(){
return new SmsSender();
}
}
//测试类
public class Test{
public static void main (String[] args){
Provider provider = new SendMailFactory();
//produce方法返回具体类的实例。Sender为接口(特殊抽象类在此相当于具体实现类的父类)
Sender sender = provider.produce();
sender.Send();
}
}
2.4Android中的Factory
比如AsyncTask的抽象工厂实现:
工厂的抽象:
1
2
3
4
public interface ThreadFactory {
//省略为备注
Thread newThread(Runnable r);
}
产品的抽象(new Runnable就是其实现类):
1
2
3
4
public interface Runnable {
//省略为备注
public abstract void run();
}
AsyncTask中工厂类的实现:
1
2
3
4
5
6
7
private static final ThreadFactory sThreadFactory = new ThreadFactory() {
private final AtomicInteger mCount = new AtomicInteger(1);
public Thread newThread(Runnable r) {
return new Thread(r, "AsyncTask #" + mCount.getAndIncrement());
}
};
我们可以创建另外类似的工厂,生产某种专门的线程(多线程),非常容易扩展。
当然,android中的应用还有很多(比如BitmapFactory),有兴趣的小伙伴可以去扒一扒。
- 工厂模式 -- 工厂方法
- 工厂模式 -- 抽象工厂
- 工厂模式-简单工厂
- 工厂模式-工厂方法
- 工厂模式:静态工厂
- 工厂模式-简单工厂
- 工厂模式-抽象工厂
- 工厂模式-工厂方法
- 工厂 > 工厂方法模式
- 工厂模式-静态工厂
- 工厂模式-抽象工厂
- 工厂模式
- 工厂模式
- 工厂模式
- 工厂模式
- 工厂模式
- 工厂模式
- 工厂模式
- 约瑟夫环问题
- Yii框架进行多条件查询,并分页
- codevs 1519 过路费(最小生成树+LCA)
- Technocup 2017 - Elimination Round 1: Transformation: from A to B
- zigbee协议栈学习(三)
- 工厂模式
- 继承
- HDU 4604 (树状数组)
- JavaWeb中的路径问题
- Java基本知识笔记
- Hadoop2.7.3+Hive2.1.0整合实现wordcount程序
- Java的接口与Scala的trait特质
- 适配器模式
- 编写无脚本的JSP页面