您的位置:首页 > 其它

阅读笔记常见的设计模式之四:工厂模式

2017-09-21 15:45 543 查看
4000

先看一个例子:

抽象产品类

public abstract class Product{
//由具体的产品类去实现
public abstract void method();
}


具体产品类A

public class ConcreteProductA extends Product{
@Override
public void method(){
syso("ConcreteProductA");
}
}


具体产品类B

public class ConcreteProductB extends Product{
@Override
public void method(){
syso("ConcreteProductB");
}
}


方式一

抽象工厂类

public abstract class Factory{
//由具体的子类去实现生产对象,返回具体的产品对象
public abstract Product createProduct(){};
}


具体工厂类A

public class ConcreteFactory extends Factory{
public Product createProduct(){
return new ConcreteProductA();
}
}


客户类

public class Client{
public static void main(String[] args){
Factory factory=new ConcreteFactory();
Product p=factory.createProduct();
p.method();
}
}


理解:

首先是定义两个抽象类:生产抽象类和工厂抽象类,前者由子类继承,实现具体子类所要生产的方法,后者由具体工厂实现,具体工厂决定自己要实现那个产品,之间的联系,是由抽象工厂类的createProduct方法建立的,这个方法返回的是Produce类型,意味着可以通过createProduct得到Product对象,从而创建产品.

这里我们得到的是ConcreteProductA的实例,如果我们想得到ConcreteProductB的实例,则只需要改一下即可:

public class ConcreteFactory extends Factory{
public Product createProduct(){
//return new ConcreteProductA();
return new ConcreteProductB();
}
}


方式二

利用反射的方式

//抽象的工厂类

Public abstract class Factory{

public abstract <T extends Product> T createProduct(Class<T> clz);

}


//具体的工厂类

public class ConcreteFactory extends Factory{
@Override
public <T extends Product> T createProduct(Class<T> clz){
try{
p=(Product)class.forName(clz.getName()).newInstance();
}
catch(Exception e){

e.printStackTrace();

}
return (T)p;
}
}


//Client的实现

public class Client{
public static void main(String[] args){
Factory factory=new ConcreteFactory();
Product p=factory.createProduct();
p.method();
}
}


来看个工厂模式的实战:

public abstract classIOHandler{

public abstract void add(String id,String name);

public abstract void remove(String id);

public abstruct void update(String id,String name);

public abstract void query(String id);
//....

}


FileHandler

public class FileHandler extends IOHandler{
@Override
public void add(String id,String name){
}
@Override
public void remove(String id){
}
@Override
public void update(String id,String name){
}
@Override
public void query(String id){
}
//..
}


XmlHandler

public class XmlHandler extends IOHandler{
@Override
public void add(String id,String name){
}
@Override
public void remove(String id){
}
@Override
public void update(String id,String name){
}
@Override
public void query(String id){
}
//..
}


DBHandler

public class DBHandler extends IOHandler{
@Override
public void add(String id,String name){
}
@Override
public void remove(String id){
}
@Override
public void update(String id,String name){
}
@Override
public void query(String id){
}
//..
}


工厂类的定义

public class IOFactory{
public static <T extends IOHandler> T getIOHandler(Class<T> clz){
IOHandler handler=null;

try{
handler=(IOHandler) class.forName(clz.getName()).newInstance();

}
catch(Exception e){
e.printStackTrace();
}
return T handler;
}
}


最后在Activity中从不同数据文件中查询得到的数据展示在一个TextView

public class FactoryActivity extends Activity{

@Override
protected void onCreate(Bundle savedInstanceState){
super.onCreate();
setContentView(R.layout.main);
final TextView tvContent=(TextView)findViewById(R.id.factory_content_tw);
//三个Button我就懒得初始化了
btnFile.setOnClickListener(new View.onClickListener(){
@Override
public void onClick(View view){
IOHandler handler=IOFactory.getIOEHandler(FileHandler.class);
Log.d("Aigestudio",handler.query("121212"));
}

});

btnXml.setOnClickListener(new View.onClickListener(){
@Override
public void onClick(View view){
IOHandler handler=IOFactory.getIOEHandler(XmlHandler.class);
Log.d("Aigestudio",handler.query("121212"));
}

});

btnDB.setOnClickListener(new View.onClickListener(){
@Override
public void onClick(View view){
IOHandler handler=IOFactory.getIOEHandler(DBHandler.class);
Log.d("Aigestudio",handler.query("121212"));
}

});

}
}


优点:降低对象的耦合,很好的扩展性

缺点:每次加入一个新产品就需要一个抽象类,新产品类和具体工厂类
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  工厂模式