工厂模式

来源:互联网 发布: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),有兴趣的小伙伴可以去扒一扒。

 

 


0 0