设计模式学习笔记——工厂模式
?
?定义了一个Mobile接口 其中只有一个方法call()
?
public interface Mobile {public void call();}
?
不同的手机品牌分别实现,比如现在有Nokia和Moto2个实例
?
public class Nokia implements Mobile{public void call() {System.out.println("Nokia produced");}}public class Moto implements Mobile{public void call() {System.out.println("Moto produced");}}
?
?而之前所说的提取方法,也就是工厂就是MobileFactory,它根据传入的参数来选择实现不同的实例,有一个produceMobile方法
?
public class MobileFactory {public Mobile produceMobile(String s){if(s.equals("Nokia")){return new Nokia();}else{return new Moto();}}}
?
?
简单工厂把主要的工作都放在了工厂中进行判断,返回哪一个实例完全由工厂确定
?
new MobileFactory().produceMobile("Nokia");?
?
?
?
public interface MobileFactory {public Mobile produceMobile();}
?
public class NokiaFactory implements MobileFactory{public Mobile produceMobile(){return new Nokia();}}public class MotoFactory implements MobileFactory{public Mobile produceMobile() {return new Moto();}}
?
MobileFactory mf=new NokiaFactory();Mobile nokia=mf.produceMobile();
?
public interface MobileFactory {public abstract Nokia produceNokia();public abstract Moto produceMoto();}
?
public class FactoryA implements MobileFactory{public Nokia produceNokia() {return new NokiaA();}public Moto produceMoto() {return new MotoA();}}public class FactoryB implements MobileFactory{public Nokia produceNokia() {return new NokiaB();}public Moto produceMoto() {return new MotoB();}}
?
public interface Nokia{public abstract void call();}
最后是产品类,也就是NokiaA,NokiaB,MotoA,MotoB
?
public class NokiaA implements Nokia{public void call() {System.out.println("NokiaA produced");}}
?
?此时,我们要生产一个NokiaA,就可以执行
?
new FactoryA().produceNokia();
?
?
由于刚看设计模式,参考了很多网上的资料,但是仍然有许多纠结着不明白的地方,比如要是让我说清楚各种工厂方法什么时候该用,就会有些不知道怎么下手,现在只能对着写好的东西去看,去理解
?
3个工厂模式上,个人理解是:
工厂方法是对简单工厂的一种扩展,简单工厂把所有的判断都放在了工厂中,而工厂方法就像是在简单工厂的工厂上又加了一层,从而不再由工厂本身去决定生产那一种实例,而是由实现这个工厂的子类去完成这一工作
抽象工厂和工厂方法上,看了不少网上的资料,有一句话是得到很普遍赞同的
工厂方法是针对一个对象,而抽象工厂模式则是对一个类而言(还是有些一知半解)
我现在可以最方便看出的是,工厂方法上,工厂和生产的实例是一一对应的关系,在创建工厂的同时,产生哪一个实例就已经被确定了,而抽象工厂模式,则是对一个组合的应用,类似于拼装的概念,在A类下有abc产品,B类下也有abc产品,这个时候就用到了抽象工厂,有专门生产a、b、c的工厂,而工厂再返回不同类别的产品,这个过程对客户类是不可见的,他看不到期间生产的实例Aa,Ba等等,而只需要去执行产品的方法就可以了
?
希望大家给予纠正,谢谢
另外,我Google浏览器。为什么在上传rar的时候,会传不上来。。。