分享

设计模式-----工厂方法模式

 集微笔记 2013-07-26

工厂方法模式

定义:Define an interface for creating an object, but let subclasses decide which class to instantiate.Factory method lets a class defer instantiation to subclasses.

定义一个用于创建对象的接口,让子类决定实例化哪一个类,工厂方法使一个类的实例化延迟到其子类。

工场方法模式最适合于在创建对象、扩展的时候使用了

下面的这个框架是工场方法比较通用的,便于扩展。(当然,在定义接口来代替抽象产品类

抽象产品类


复制代码
public abstract class Product
{
//产品类公共方法
public void method1()
{
}
//抽象方法
public abstract void method2();
}
复制代码

具体产品类

可以有多个具体产品类,都是继承自抽象产品类


复制代码
public class Productone extends Product
{
//必须实现抽象方法
public void method2()
{

}
}

public class Producttwo extends Product
{
//必须实现抽象方法
public void method2()
{

}
}
复制代码

抽象工厂类

定义产品时使用


复制代码
public abstract void Maker
{
/*
* 创建一个产品对象后,输入参数类型可以自行设置
* 这里使用到泛型,makeProduct里的参数必须是Class类型且是Product的实现类
*/
public abstract <T extends Product> T makeProduct(Class<T> c);
}
复制代码

具体工厂类

具体工厂类才是如何生产一个产品的类,实现抽象工厂类


复制代码
public class ReadMaker extends Maker
{
public <T extends Product> T makeProduct(Class<T> c)
{
Product product = null;
try
{
product = (Product)Class.forName(c.getName()).newInstance();
}catch(Exception e)
{
//deal with exception
}
return (T)product;
}
}
复制代码

场景类


复制代码
public class Client
{
public static void main(String args[])
{
Maker maker = new ReadMaker();
Product product = maker.makeProduct(Product1.class);
}
}
复制代码

下面是一个具体的例子,很直观

定义一个抽象产品手机类


复制代码
package com.loulijun.chapter8;
//手机类,包括很多
public abstract class Phone {
//打电话
public void call(){};
//音乐
public void music(){};
//上网
public void via_internet(){};
}
复制代码

实现产品类1:实现一个iphone


复制代码
package com.loulijun.chapter8;

public class iPhone extends Phone {

@Override
public void call() {
System.out.println("用iphone打电话");
}

@Override
public void music() {
System.out.println("用iphone听音乐");
}

@Override
public void via_internet() {
System.out.println("用iphone上网");
}
}
复制代码

实现产品类2:Android手机


复制代码
package com.loulijun.chapter8;

public class AndroidPhone extends Phone {

@Override
public void call() {
System.out.println("用Android手机打电话");
}

@Override
public void music() {
System.out.println("用Android手机听音乐");
}

@Override
public void via_internet() {
System.out.println("用Android手机上网");
}
}
复制代码

实现产品类3:Windows Phone,云集当前三大流行机型


复制代码
package com.loulijun.chapter8;

public class WindowsPhone extends Phone {

@Override
public void call() {
System.out.println("用windows phone手机打电话");
}

@Override
public void music() {
System.out.println("用windows phone手机听音乐");
}

@Override
public void via_internet() {
System.out.println("用windows phone手机上网");
}

}
复制代码

抽象一个富士康(富士康是代工厂嘛)


复制代码
package com.loulijun.chapter8;
//抽象类,抽象富士康
public abstract class AbstractFoxconn {
/**
* 这里采用泛型对createPhone的输入参数产生显示
* 1、输入参数必须是Class类型
* 2、输入参数必须是Phone的实现类
*/
public abstract <T extends Phone> T createPhone(Class<T> c);
}
复制代码

实现抽象类


复制代码
package com.loulijun.chapter8;
//实现类,富士康工厂
public class Foxconn extends AbstractFoxconn {

@Override
public <T extends Phone> T createPhone(Class<T> c) {
//定义一个手机
Phone phone = null;
try
{
//生产一个手机
phone = (Phone)Class.forName(c.getName()).newInstance();
}catch(Exception e)
{
e.printStackTrace();
}
return (T)phone;
}
}
复制代码

场景类,深圳


复制代码
package com.loulijun.chapter8;
//场景类,深圳的富士康代工生产各种系统的手机
public class Shenzhen {
public static void main(String args[])
{
//富士康
AbstractFoxconn foxconn = new Foxconn();
//生产iphone
System.out.println("----------生产一部iphone----------");
Phone iphone = foxconn.createPhone(iPhone.class);
iphone.call();
iphone.music();
iphone.via_internet();
//生产AndroidPhone
System.out.println("----------生产一部AndroidPhone,如htc的----------");
Phone androidphone = foxconn.createPhone(AndroidPhone.class);
androidphone.call();
androidphone.music();
androidphone.via_internet();
}
}
复制代码

运行结果:

----------生产一部iphone----------
用iphone打电话
用iphone听音乐
用iphone上网
----------生产一部AndroidPhone,如htc的----------
用Android手机打电话
用Android手机听音乐
用Android手机上网

这样一个完成的工场方法模式就结束了,当然具体怎么用,怎么扩展就要根据实际项目来操作了

工场方法模式的优缺点可以参考:http://blog.csdn.net/beyondhaven/article/details/6948067

工场方法模式可以有很多中变换,可以是简单工场方法模式,可以是多工场方法模式,可以替换单例模式等等

简单工场方法模式:

不需要抽象工场类,并且createPhone方法时static (静态)的

多工场方法模式:

通过继承基抽象工场细分不同产品所对应的抽象工场,例如生产iphone、AndoridPhone、WindowsPhone所继承的工场分别是三个不同的继承自AbstractFoxconn的不同抽象工场,然后在场景类中根据具体需求选择需要使用的抽象工场

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多