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),有兴趣的小伙伴可以去扒一扒。