Java 设计模式简谈 -- 工厂模式

背景

经常听到很多人说设计模式。 也觉得设计模式很是重要,但是迟迟没有对自己的所知所学做些总结。

这里将对几种设计模式做一次总结。

模式统一先从哪里用到开始讲,然后再讲设计模式是如何使用的。
不然诸位看官知道了设计模式后还会依然很茫然。

工厂模式

工厂模式作用

工厂模式是用来创建其他对象的对象。

比如我们熟悉的类Calendar

java.util.Calendar - getInstance()
java.util.Calendar - getInstance(TimeZone zone)
java.util.Calendar - getInstance(Locale aLocale)
java.util.Calendar - getInstance(TimeZone zone, Locale aLocale)
java.text.NumberFormat - getInstance()
java.text.NumberFormat - getInstance(Locale inLocale)

还有创建Bitmap的BitmapFactory,下面所有的方法都是返回Bitmap,只是因为参数的不同所以创建的方法不同而已。也是一中工厂模式。

方法名(只列出部分方法) 参数及解释
decodeByteArray(byte[] data, int offset, int length) 从指定字节数组的offset位置开始,将长度为length的数据
decodeFile(String pathName) 从pathName对应的文件解析成的位图对象
decodeFileDescriptor(FileDescriptor fd) 从FileDescriptor中解析成的位图对象
decodeResource(Resource res,int id) 根据给定的资源Id解析成位图
decodeStream(InputStream in) 把输入流解析成位图

什么是工厂模式

wiki的解释是:

在面向对象程序设计中,工厂通常是一个用来创建其他对象的对象。工厂是构造方法的抽象,用来实现不同的分配方案。

工厂对象通常包含一个或多个方法,用来创建这个工厂所能创建的各种类型的对象。这些方法可能接收参数,用来指定对象创建的方式,最后返回创建的对象。
有时,特定类型对象的控制过程比简单地创建一个对象更复杂。在这种情况下,工厂对象就派上用场了。工厂对象可能会动态地创建产品对象的类,或者从对象池中返回一个对象,或者对所创建的对象进行复杂的配置,或者应用其他的操作。
这些类型的对象很有用。几个不同的设计模式都应用了工厂的概念,并可以使用在很多语言中。例如,在《设计模式》一书中,像工厂方法模式、抽象工厂模式、生成器模式,甚至是单例模式都应用了工厂的概念。

简单来说,工厂模式就是用来创建其他对象的对象。

普通工厂

例如有一个Phone类来表示手机,手机又区分成smartPhone 和 FuncPhone 。 那么这几个类用于工厂类可以如下表示:

class Phone{/*.......*/}
class SmartPhone extends Phone{/*.......*/}
class FuncPhone extends Phone{/*.......*/}

//它们的工厂类
interface PhoneFactory{
    abstract Phone createPhone();
}

class SmartPhoneFactory implements ButtonFactory{
    Phone createButton(){
        return new SmartPhone();
    }
}
class FuncPhoneFactory implements PhoneFactory{
    Phone createButton(){
        return new FuncPhone();
    }
}

但是上面的代码比较复杂。 每种工厂类都要弄一个类。 我们应该把创建的类都放在一个地方

// 多个工厂方法
public class HumanFactory{
    public static Male createMale() {
        return new Male();
    }
    public static Female createFemale() {
        return new Female();
    }
}

// 工厂测试类
public class FactoryTest {
    public static void main(String[] args){
        Human male = HumanFactory.createMale();
        male.eat();
        male.sleep();
        male.beat();
    }
}

你可能感兴趣的:(Java 设计模式简谈 -- 工厂模式)