参考了博客 https://www.jianshu.com/p/e55fbddc071c 考虑此设计模式中有产品类,工厂类和测试类。 首先产品类在 other 包中:
package other;
public abstract class Product{
public abstract void Show();
}
//具体产品类 A
class ProductA extends Product{
@Override
public void Show() {
System.out.println("生产出了产品 A");
}
}
//具体产品类 B
class ProductB extends Product{
@Override
public void Show() {
System.out.println("生产出了产品 C");
}
}
//具体产品类 C
class ProductC extends Product{
@Override
public void Show() {
System.out.println("生产出了产品 C");
}
}
工厂类在 other 包中:
package other;
public class Factory {
public static Product Manufacture(String ProductName){
//工厂类里用 switch 语句控制生产哪种商品;
//使用者只需要调用工厂类的静态方法就可以实现产品类的实例化。
switch (ProductName){
case "A":
return new ProductA();
case "B":
return new ProductB();
case "C":
return new ProductC();
default:
return null;
}
}
}
最后是测试类,在默认包中:
//工厂产品生产流程
import other.Factory;
public class SimpleFactoryPattern {
public static void main(String[] args){
Factory mFactory = new Factory();
//客户要产品 A
try {
//调用工厂类的静态方法 & 传入不同参数从而创建产品实例
mFactory.Manufacture("A").Show();
}catch (NullPointerException e){
System.out.println("没有这一类产品");
}
//客户要产品 B
try {
mFactory.Manufacture("B").Show();
}catch (NullPointerException e){
System.out.println("没有这一类产品");
}
//客户要产品 C
try {
mFactory.Manufacture("C").Show();
}catch (NullPointerException e){
System.out.println("没有这一类产品");
}
//客户要产品 D
try {
mFactory.Manufacture("D").Show();
}catch (NullPointerException e){
System.out.println("没有这一类产品");
}
}
}
疑问 1.Product 文件中,如果 Product 抽象类没有加 public,那么测试类的每个Show()
处都会报错 cant access show() in other.Product.然后这里我加上了 public 就不会报这个错了。但为什么测试类不需要加上import other.Product
呢,即使我加上,idea 也告诉我说,导入的这个Product
从来没被用过?
疑问 2.现在的代码能运行,但每个Show()
处都会报警告,说调用 show 可能引发空指针异常。我以为把工厂类的 default 行为改了改成return new ProductC();
就不会报这个警告了。但还是报这个警告,为啥啊?
1
v2overflow 2019-08-17 22:06:50 +08:00
2,没 break 吧
|
2
amiwrong123 OP @v2overflow
你说 switch case 啊,因为每个分支都有 return,所以不用加 break,加在后面也执行不到。 |
3
ywcjxf1515 2019-08-17 22:18:10 +08:00 via iPad
mFactory.Manufacture("XXX")的结果是,父类引用指向子类对象,后面 show 调用的是父类的方法,方法内容由子类定,父类的 show 方法是默认的包可见性,就不能 access 父亲的 show 方法。你可以向下转型,子类引用指向子类对象,这样 show 方法是子类的 show 方法,可见性是 public。
|
4
iEverX 2019-08-17 22:20:00 +08:00
1. 因为确实没用到。Java 从来不要求使用了方法就需要 import
2. 应该没问题,ide 反应慢吧 |
5
amiwrong123 OP @ywcjxf1515
等一下,父类的 show 方法是 public 的啊,不是默认包可见啊。我比较纳闷的是,为毛不加上 import other.Product,它还能调用 show 呢。。 而且我发现报错信息 cant access show() in other.Product 这句里面,为毛报错信息都知道 Product 都知道这个 Product 在 other 包而不是其他包中呢。。。 |
6
amiwrong123 OP |
7
iEverX 2019-08-17 22:45:24 +08:00
|
8
ywcjxf1515 2019-08-17 22:55:23 +08:00 via iPad
@amiwrong123 疑问 1 里你补加的 public 是在类上的吧,没加之前是默认的包可见性,方法也跟着是。
因为你调用这个 show 方法时,没有出现父类,就不用导入。你可以写一个工厂类,工类类方法返回一个 ArrayList,调用这个工厂类方法,同样不用引用变量接着,直接调用 ArrayList 的方法,你会发现同样不用导入 ArrayList。 |
9
amiwrong123 OP @iEverX
看到了这句 You may live without any import statement when you always specify the full qualified name of classes。 现在我的理解是:编译器知道 mFactory.Manufacture("XXX")的返回值类型是 other.Product,而且编译器不仅知道返回值类型,而且它还不用我告诉它这个类型(指在测试类中加入 import other.Product ),就算我加了 import other.Product,它也会对我说:“我不用你的,我自己知道!”(报警告,此 other.Product 从未被用过) |
10
amiwrong123 OP @ywcjxf1515
关于访问权限我懂了,先是看类的访问权限,再是看类里各个方法的访问权限。两个都可以才可以访问到。 关于直接调用 show,直接原因应该就是因为我没有用引用去接产品类对象,所以可以直接调用。但总感觉没理解到位== |
11
amiwrong123 OP @iEverX
疑问 2 解决,就是因为 default 返回 null 的原因。真的反应慢。 |
12
iEverX 2019-08-17 23:30:21 +08:00
import other.Product 只是把名字 Product 当作 other.Product。既然没有用 Product 这个名字,当然就不用 import
|