public class GreenApple extends Apple{
@Override
public void pluckApple() {
Log.d("GreenApple","种绿苹果的工厂在摘苹果");
}
}
3,接下来就要实现工厂类了,先建一个基类,抽象出生产苹果的方法,这儿用了泛型:
public abstract class Factory{
public abstract <T extends Apple> T produceApple(Class<T> clz);
}
再建苹果工厂:
public class AppleFactory extends Factory {
@Override
public <T extends Apple> T produceApple(Class<T> clz) {
Apple apple = null;
try {
//这儿使用了反射机制
apple = (Apple) Class.forName(clz.getName()).newInstance();
} catch (Exception e) {
e.printStackTrace();
}
return (T) apple;
}
}
//如果你不想用反射机制,就酱紫判断吧,或者单独创建生产红苹果和绿苹果的工厂
@Override
public T produceApple(Class clz) {
Apple apple = null;
if ("RedApple".equals(clz.getSimpleName())){
apple = new RedApple();
}else if("GreenApple".equals(clz.getSimpleName())){
apple = new GreenApple();
}
return (T) apple;
}
4,最后就是使用了,创建一个工厂,工厂分别生产了红苹果和绿苹果,并调用了采摘苹果的方法
Factory factory = new AppleFactory();
factory.produceApple(RedApple.class).pluckApple();//打印的是 摘的是红苹果
factory.produceApple(GreenApple.class).pluckApple();//打印的是 摘的是绿苹果
简单说下我自己的理解:
工厂模式需要:产品、工厂、客户端。
首先,红苹果和绿苹果都需要采摘,所以有个苹果的抽象类,并有采摘的抽象方法。
然后,需要一个厂家来生产苹果,可以通过约定来生产不同的苹果。
最后,客户端通过工厂来生成不同的苹果就好。
备注:在工厂创建产品时,我用的是反射机制实现的。如果不想用反射机制,那当产品比较多时,判断的逻辑就会很长,这时候,就可以用**工厂方法模式**解决了(我就不写这个模式了,懒癌犯了),工厂方法模式简单说就是解决产品过多的问题,就是创建不同的苹果工厂继承Factory,我举得例子里只是创建了一个苹果工厂,在这一个苹果工厂里判断是生成哪个产品。但如果创建了不同的苹果工厂,那就不用进行逻辑判断了,当新增产品时,不需要修改代码,直接新增一个产品的工厂就好,符合面向对象编程的开放封闭原则。
**抽象工厂模式:**
1,要创造个机器人产品,并抽象出它的零件底盘和语音系统
public interface Rebot {
interface BasePlate{
void walk();
}
interface Mouse{
void talk();
}
}
2,底盘有圆的和方的
public class CircleBasePlate implements Rebot.BasePlate {
@Override
public void walk() {
Log.d("CircleBasePlate","调用了圆底盘的walk方法");
}
}
public class RectangleBasePlate implements Rebot.BasePlate {
@Override
public void walk() {
Log.d("RectangleBasePlate","调用了方底盘的walk方法");
}
}
3,语音系统有适合大机器人的和小机器人的
public class BigMouse implements Rebot.Mouse {
@Override
public void talk() {
Log.d("BigMouse","大机器人在说话");
}
}
public class SmallMouse implements Rebot.Mouse {
@Override
public void talk() {
Log.d("SmallMouse","小机器人在说话");
}
}
4,建工厂,需要生产底盘和语音系统
public abstract class Factory2 {
public abstract Rebot.BasePlate createBasePlate(Class clz);
public abstract Rebot.Mouse createMouse(Class clz);
}
最后
针对Android程序员,我这边给大家整理了一些资料,包括不限于高级UI、性能优化、架构师课程、NDK、混合式开发(ReactNative+Weex)微信小程序、Flutter等全方面的Android进阶实践技术;希望能帮助到大家,也节省大家在网上搜索资料的时间来学习,也可以分享动态给身边好友一起学习!
-
Android前沿技术大纲
-
全套体系化高级架构视频
Android高级架构资料、源码、笔记、视频。高级UI、性能优化、架构师课程、混合式开发(ReactNative+Weex)全方面的Android进阶实践技术,群内还有技术大牛一起讨论交流解决问题。
网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。
一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!
oid进阶实践技术,群内还有技术大牛一起讨论交流解决问题。**
网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。
一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!