转载请声明地址:http://blog.csdn.net/bxllove/article/details/65662260
1.简介
提到 ”工厂“ 顾名思义 ,”工厂”这个词汇在百度此条里被翻译为“制造厂”,是用来生产货物的工业建筑物 。而今天我们所介绍到的工厂模式和这个差不多,也是用来生产产品的"工业建筑物"。他们的功能都是一样的 即创造生产”产品“ 一个工厂可以生产一类产品也可以生产多类产品。 这完全取决于工厂方法的的设计制定。“制造者”可以根据个人的需要设计出自己所需要的相关类产品。
2.工厂模式定义
简单的来说所谓的工厂在java中就是通过创建一个对象的接口 而让子类具体实例化某个类。
3.工厂模式设计原理UML
4.具体代码实现类如下:
第一步:
/*ZHM * 抽象生产的产品 */ public abstract class AbsProduct { // 制造产品例如:可以各种型号的车 但具体型号车以及参数由子类实现 public abstract void made(); }
第二步:
/** * 子类(ProOne)代表中国产品(中国车) */ public class ProOne extends AbsProduct { // 制造中国车 @Override public void made() { System.out.println("雪铁龙,made in 中国"); } }
/**ZHM * 子类(ProTwo)代表美国产品 (美国车) * @author ZHM * */ public class ProTwo extends AbsProduct { @Override public void made() { System.out.println( "福特,made in America"); } }第三步:
/**ZHM * 抽象工厂生产间 * @author ZHM * */ public abstract class AbsFactory { //生产抽象产品 public abstract AbsProduct createPro(); }第四步:
/*ZHM * ProOneFactory 代表中国生产车间 */ public class ProOneFactory extends AbsFactory { @Override public AbsProduct createPro() { return new ProOne();// 创建中国产品实现中国的伟大复兴梦 } }
/*ZHM * ProTwoFactory类 美国汽车制造商 */ public class ProTwoFactory extends AbsFactory { @Override public AbsProduct createPro() { return new ProTwo();//创造美国产品 } }
第五步:
public class complete { public static void main(String[] args) { AbsFactory chinaFactory = new ProOneFactory(); AbsFactory amricaFactory = new ProTwoFactory(); ProOne china =(ProOne) chinaFactory.createPro(); ProTwo amrica =(ProTwo) amricaFactory.createPro(); china.made(); amrica.made(); } }
打印结果:
雪铁龙,made in 中国 福特,made in America
总结:通过以上事例不难发现工厂模式是依赖于抽象架构的。 由子类实例化抽象接口 是有很好扩展性功能的 并且它能够降低对象之间的耦合性 同时也是符合开发设计原则的。
思考:
但我们不能总是每生产一种产品就创建这种产品的工厂 ,想想有没有可能性让 这条生产线工厂能够生产多种产品 也就是说让一个工厂生产不同型号品牌的车。答案是有的 。
具体代码如下 :--------------------------------------------------------------------------------
第一步:
/* * 抽象生产的产品 */ public abstract class AbsProduct { // 制造产品例如:可以各种型号的车 但具体型号车以及参数由子类实现 public abstract void made(); }第二步:
/* * 具体实现One类 */ public class ProOne extends AbsProduct { // 制造中国车 @Override public void made() { System.out.println("大家好我是雪铁龙汽车"); } }
/** * 子类(ProTwo)代表美国产品 (美国车) * @author ZHM * */ public class ProTwo extends AbsProduct { @Override public void made() { System.out.println( "大家好我是福特汽车"); } }第三步:
/** * 抽象工厂生产间 * * @author ZHM * */ public abstract class AbsFactory { // 生产抽象产品 public abstract <T extends AbsProduct> T createPro(Class<T> clz); }第四步:
/** * 大的生产车间 中美合作共同投资的车间 各种车各种成产 * * @author zhm * */ public class BigFactory extends AbsFactory { AbsProduct p = null; public <T extends AbsProduct> T createPro(Class<T> clz) { try { p = (AbsProduct) Class.forName(clz.getName()).newInstance(); } catch (Exception e) { // TODO Auto-generated catch block e.printStackTrace(); } return (T) p; } }
第五步:
public class complete { public static void main(String[] args) { AbsFactory bigFactory = new BigFactory(); ProOne chinaCar=bigFactory.createPro(ProOne.class); chinaCar.made(); ProTwo amricaCar=bigFactory.createPro(ProTwo.class); amricaCar.made(); } }打印结果:
大家好我是雪铁龙汽车
大家好我是福特汽车
总结:是不是眼睛一亮 茅塞顿开 ,不明白的可以这么想 第一个车间只能生产一个国家的车(中国车),第二个车间是由中美共同投资的车间就能建造两个国家的车型(中国车和美国车)大家都玩过红色警戒吗 当自己的工程师偷了敌人的基地也就能建造两个国家的建筑及武器了 这个大工厂就好比是已被偷了的基地 。。个人是这么理解的 其实也就是改变了由子类实现接口实例中的方法 。( ProOneFactory ProTwoFactory )--------集合成了------->(BigFactory) 代码虽简单但还是需要反复不断的练习思考明白原理 不然, 一旦被问到 尤其是面试 啥都不知道就懵B了 。
工厂模式的应用场景 :缓存机制有磁盘缓存 内存缓存 或者文件存储(sqllite)和(sharedPreferences) 画板上的一些增删查改 大概就这意思......
小提示: 如若哪里说错请@ME及时纠正 让我们 共同学习,共同进步吧 -------------Dr