工厂设计模式:适合内容扩展用
创建AnimalFatory :
首先设置个范围最大的接口名如:动物,交通工具等等:这里来生产动物,为什么先不管
public interface AnimalFatory {
eat.geteat();
run.getrun();
}
做什么:eat,run
然后再设置个抽象类,表明动物工厂要生产的东西,但不说怎么生产:生产吃饭的动物和跑步的动物
public abstract class eat{
public abstract void whoeat();
}
跑步的动物
public abstract class run{
public abstract void getrun();
}
怎么做:Cateat ,Dogrun
这里就是来描述怎么做上面说的东西了,自然要继承上面所要做的东西
猫怎么吃饭
public class Cateat extends eat{
@Override
public void whoeat() {
System.out.println("猫吃饭");
}
}
狗怎么跑步
public class Dogrun extends run{
@Override
public void getrun() {
System.out.println("狗跑步");
}
}
开始正式生产过程:AnimalFatoryProduct
先拿到工厂决定生产的对象,再创建生产具体对象的过程(new Cateat())
public class AnimalFatoryProduct implements AnimalFatory {
@Override
public eat geteat() {
// TODO Auto-generated method stub
return new Cateat();
}
@Override
public run getrun() {
// TODO Auto-generated method stub
return new Dogrun();
}
}
以上都完备了,就可以让程序照什么的步骤来一步步生产了:AnimalProdure
public class AnimalProdure {
public static void main(String[] args) {
//新建工厂,向上转型为抽象工厂(为什么向上转型:https://blog.youkuaiyun.com/guchenjun789/article/details/81055317),工厂内有下一步的方法
AnimalFatory Animal = new AnimalFatoryProduct();
//调用下一步骤的方法,调用getcat方法生产cateat 对象,由于cateat对象继承于eat,则可以向上转型为eat对象
eat cats = Animal.geteat();
//eat对象有个geteat方法,则开始实施最终方法(猫对象的最终输出动作:猫吃饭)
cats.whoeat();
//同上
dog dog = Animal.getdag();
dog.run();
}
}
以上假如是你第一次想要的程序,接着你要扩展功能怎么办,想要吃的动物不是猫,是鸟。这个时候你不用更改上面程序。只需要新建个类继承cateat的抽象类:
public class beardeatfish extends eat {
@Override
public void whoeat() {
System.out.println("鸟吃饭");
}
}
以上,吃的对象又扩展了一个,然后再创建个生产线,继承工厂
public class OrtherAnimalFactoryProduct implements AnimalFatory {
@Override
public eat geteat() {
// TODO Auto-generated method stub
return new beardeatfish ();
}
}
生产
AnimalFatory otherAnimal = new OrtherAnimalFactoryProduct();
eat beardeatfishs = otherAnimal .geteat();
beardeatfishs .whoeat();
这样,就是所谓的创建一个工厂,里面可以多个生产线来创建同类但不同尺寸或不同花样的产品
当然,你甚至可以把接口定位地球,然后生产任何东西(一般只是说说,这样搞估计就生成的东西范围毕竟大,不好掌控)