阅读笔记常见的设计模式之四:工厂模式
2017-09-21 15:45
543 查看
4000
先看一个例子:
抽象产品类
具体产品类A
具体产品类B
方式一
抽象工厂类
具体工厂类A
客户类
理解:
首先是定义两个抽象类:生产抽象类和工厂抽象类,前者由子类继承,实现具体子类所要生产的方法,后者由具体工厂实现,具体工厂决定自己要实现那个产品,之间的联系,是由抽象工厂类的createProduct方法建立的,这个方法返回的是Produce类型,意味着可以通过createProduct得到Product对象,从而创建产品.
这里我们得到的是ConcreteProductA的实例,如果我们想得到ConcreteProductB的实例,则只需要改一下即可:
方式二
利用反射的方式
//抽象的工厂类
//具体的工厂类
//Client的实现
来看个工厂模式的实战:
FileHandler
XmlHandler
DBHandler
工厂类的定义
最后在Activity中从不同数据文件中查询得到的数据展示在一个TextView
优点:降低对象的耦合,很好的扩展性
缺点:每次加入一个新产品就需要一个抽象类,新产品类和具体工厂类
先看一个例子:
抽象产品类
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")); } }); } }
优点:降低对象的耦合,很好的扩展性
缺点:每次加入一个新产品就需要一个抽象类,新产品类和具体工厂类
相关文章推荐
- 阅读笔记常见的设计模式之三:备忘录模式的简单理解
- 阅读笔记常见的设计模式之二:观察者模式
- 阅读笔记常见的设计模式之一:单例模式
- .Net学习笔记----2015-06-27(简单工厂设计模式)
- 设计模式学习笔记——工厂方法(Factory Method)
- 【设计模式学习笔记】——工厂系列
- 设计模式学习笔记(6):工厂模式(2)
- java笔记--设计模式之工厂模式
- 设计模式学习笔记——工厂模式
- 设计模式学习笔记四:工厂方法(Factory Method)
- Java-马士兵设计模式学习笔记-工厂模式-模拟Spring读取Properties文件
- iOS学习笔记—11 常见设计模式
- 《Head First 设计模式》阅读笔记(五)——单件模式
- JAVA学习笔记-----设计模式之工厂模式
- [设计模式整理笔记 六] 工厂模式与创建者模式总结
- 设计模式学习笔记(1) - 简单工厂模式
- 设计模式笔记-创建型模式之三--工厂方法:Factory Method
- 咕泡-工厂 Factory设计模式笔记
- 学习设计模式笔记--简单工厂
- 设计模式学习笔记一 简单工厂策略模式实现销售策略的变更(一)