大话设计模式之_工厂模式
- 工程方法(即简单工厂模式simpleFactory,或静态工厂方法 static factory method)
- 抽象工厂
什么是工厂呢?
工程模式是我们最常用的设计模式,在很多开源框架里头可以说工程模式是遍地开花呀,当然你如果你有兴趣写一个开源框架那么还得掌握:注解、反射机制,这个小笔笔会在后面跟大家分享吐槽。给大家附上:笔者曾经写的一个app的下拉刷新和加载更多的框架(由于涉及到公司的安全协议,这里给大家分享实现的思路和部分核心代码)
言归正传:工厂模式是我们最常用的实例化对象模式,通俗的说就是用工厂方法替代new操作一种设计模式
1.工厂方法
核心思想就只要记住一句话:有一个抽象的Factory类(可以是抽象类和接口)这个类不负责在具体的产品生产,而是制定一种规范,具体的生产由其子类去完成。
ps:如果你理解上面这句话了,那么就说明你已经掌握了过程设计模式的精髓了,现在你已经成功了80%了,别担心,剩下的20%我给大家贴个demo就一目了然了
//1.定义接口
public interface People{
public void say();
}
//2.1接口的实现类
public void Chinese implements People{
public void say(){
system.out.printfln("中国话");
}
}
//2.2接口的实现类
public void Amercia implements People{
public void say(){
system.out.printfln("英语");
}
}
//3.工厂类,制定规范
public class People_Factory{
//方法的返回值,用到了多态
public static People create(int type){
if(type ==1){
return new Chinese();
}else if(type ==2){
return new Amercia();
}
}
}
//4.演示效果
public class TestFactory{
public static void main(String[]args){
People p = People_Factory.create(1);
p.say();
People p = People_Factory.create(2);
p.say();
}
}
2.抽象工厂
抽象工厂模式是工厂方法模式的升级版,它是用来创建一组相关或者相互依赖的对象。(又是很精辟的一句话,此处高能好好品味)
是不是有点难以理解?那就看下他们的区别对比下不同点,然后就知道抽象工厂是什么了。工厂方法模式针对的是一个产品等级结构;而抽象工厂模式则是对对个产品等级结构。
在编码中,通常一个产品结构为一个接口或者抽象类,也就是说,工厂方法模式提供的所有产品都是衍生自同一个接口或者抽象类的,而抽象工厂模式所提供的产品则是衍生自不同的接口或者抽象类。
在抽象工厂模式中,有一个产品族的概念(即位于不同产品等级结构中功能相关联的产品组成的家族)。抽象工厂模式所提供的一系列产品就组成一个产品族;而工厂方法提供的一系列产品称为一个等级结构。
下面以生产汽车的例子讲述抽象工厂
2.0排量两车厢、2.3排量两车厢:属同一等级结构**
2.0排量两车厢、2.0排量三车厢:属同一个产品族**
ps:老规矩上代码,讲了一大通还是代码直观点
//1.1定义产品1接口
public IProduct1{
public void show();
}
//1.2定义产品2接口
public IProduct2{
public void show();
}
//2.1实现定义的接口
class Product1 implements IProduct1{
public void show(){
system.out.println("这是产品1");
}
}
//2.2实现定义的接口
class Product2 implements IProduct2{
public void show(){
system.out.println("这是产品2");
}
}
//3抽象工厂的接口
interface IFactory{
public IProduct1 createProduct1();
public IProduct2 createProduct2();
}
//4抽象工厂的实现类
class MyFactory implements IFactory{
public IProduct1 createProduct1(){
return new Product1();
}
public IProduct2 createProduct2(){
return new Product2();
}
}
//5如何使用
public class Client{
public static void main(String[]args){
IFactory factory = new MyFactory();
factory.createProduct1().show();
factory.createProduct1().show();
}
}
总结
如果工厂的产品全部属于同一个等级结构,则属于工厂方法模式;如果工厂的产品来自多个等级结构,则属于抽象工厂模式。