走一走百度百科
🌐工厂模式是我们最常用的实例化对象模式了,是用工厂方法代替new操作的一种模式。著名的Jive论坛 ,就大量使用了工厂模式,工厂模式在Java程序系统可以说是随处可见。因为工厂模式就相当于创建实例对象的new,我们经常要根据类Class生成实例对象,如A a=new A() 工厂模式也是用来创建实例对象的,所以以后new时就要多个心眼,是否可以考虑使用工厂模式,虽然这样做,可能多做一些工作,但会给你系统带来更大的可扩展性和尽量少的修改量。
一般来说这里分为:简单工厂模式、工厂模式、抽象工厂模式这三种,其实简单工厂和工厂差不多,结合一起理解,在这里我想强调各位看官我希望是已经了解过工厂模式的,不然后面看起来会懵懵的,但是如果说你的阅读理解能力还不错的话,当我没说哈,得不偿失,可以先去了解工厂模式,再来开水果店,如果已经了解过了,那就往下看吧!🍍
接下来,请各位看官将自己想象成一位水果店的大老板!
水果店开张前的准备
🔥🔥🔥生意兴隆🔥🔥🔥
进货
店铺开张之前,最重要的就是你这个店的进货问题啦,假设现在进货进了香蕉🍌、苹果🍎、橙子(或者叫橘子,无所谓)🍊,进这些货,我最重要的就是要了解这些水果的信息
工厂模式:
定义一个接口,这个接口叫做Fruit:
/**
* 水果接口
*/
public interface Fruit {
/**
* 水果信息
* @return
*/
String getFruitInfo();
}
接下来就是让这三种水果实现这个接口啦:都是水果嘛
🍎
/**
* 苹果
*/
public class Apple implements Fruit {
private String description;
public String getFruitInfo()
{
description = " 苹果: \n\n苹果富含矿物质和维生素,为人们最常食用的水果之一";
return description;
}
}
🍌🍌
/**
* 香蕉
*/
public class Banana implements Fruit
{
private String description;
public String getFruitInfo()
{
description = "香蕉: \n\n香蕉味香、富含营养,植株为大型草本,从根状茎发出,由叶鞘下部形成高3~6米(10~20尺)的假杆";
return description;
}
}
🍊
/**
* 橙子
*/
public class Orange implements Fruit
{
private String description;
public String getFruitInfo()
{
description = "橙子: \n\n橙子可以剥皮鲜食其果肉,果肉可以用作其他食物的调料或附加物";
return description;
}
}
得到这三种水果的信息之后,就要去跟水果市场老板拿货啦,水果市场老板对不同种类的水果都会有一片果园,这里有多种多样的水果,并且不同的果园产不同的水果,这里就是我们的“工厂”🌿🌿🌿,那么我们现在就去找工厂吧!
找水果厂
接下来,去找一下不同类型的水果工厂:
🍎
/*
* 苹果工厂:生产苹果
* */
public class AppleFactory {
public Apple createApple(){
Apple apple = new Apple();
return apple;
}
}
🍌香蕉工厂
/*
* 香蕉工厂:生产香蕉
* */
public class BananaFactory {
public Banana createBanana(){
Banana banana = new Banana();
return banana;
}
}
🍊橘子工厂
/*
* 橘子工厂:生产橘子
* */
public class OrangeFactory {
public Orange createOrange(){
Orange orange = new Orange();
return orange;
}
}
🆗,现在工厂也已经找好了,那么现在先来演示一下进货情况吧!
/*
* 进货单
* */
public class Order {
public static void main(String[] args) {
System.out.println("老板好,以下是你的进货单!");
System.out.println("苹果厂生产的苹果....");
AppleFactory appleFactory = new AppleFactory();
Apple apple = appleFactory.createApple();
System.out.println("香蕉厂生产的香蕉....");
BananaFactory bananaFactory = new BananaFactory();
Banana banana = bananaFactory.createBanana();
System.out.println("橘子厂生产的橘子....");
OrangeFactory orangeFactory = new OrangeFactory();
Orange orange = orangeFactory.createOrange();
System.out.println("进货单如上");
}
}
🍍🍍🍍🍍
现在你遇到了另一个难题,如果说我每次进货都要和3个水果工厂老板打电话,非常麻烦,可不可以就找一家工厂呢?这个工厂既可以生产苹果,又可以生产橘子,这样我要进货的话,就直接和这个厂家老板打电话就好了🙋♀️
巧了,刚好有一家!
找“厉害”的水果厂
这个厂家的地址
:
public abstract class AbstractFactory {
public abstract <T extends Fruit> T createFruit(Class<T> c);
}
这个厂家生产水果的过程:
public class FruitFactory extends AbstractFactory{
@Override
public <T extends Fruit> T createFruit(Class<T> c) {
Fruit fruit = null;
try {
fruit = (T) Class.forName(c.getName()).getDeclaredConstructor().newInstance();
}catch (Exception e){
System.out.println("本工厂没有生产该品种的水果噢!");
e.printStackTrace();
}
return (T)fruit;
}
}
现在你又要进货了,那现在来看一下你最新的进货单吧!
public class Order {
public static void main(String[] args) {
System.out.println("你最新的进货单来啦");
FruitFactory fruitFactory = new FruitFactory();
Apple apple = fruitFactory.createFruit(Apple.class);
System.out.println("老板,苹果已打包好!");
Banana banana = fruitFactory.createFruit(Banana.class);
System.out.println("老板,香蕉已打包好!");
Orange orange = fruitFactory.createFruit(Orange.class);
System.out.println("老板,橘子已打包好!");
System.out.println("进货单如上");
}
}
现在来看看我们的工厂构造:
下期预告
好啦,今天就到这,今天本店休息啦!
下一期预告:
苹果我想要进不同品种的!红富士、东北苹果…
香蕉我也要不同品种的!!!
橘子也要!!!
要不,再来点水蜜桃🍑🍑?🙋♀️🙋♀️🙋♀️