参考了博客 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();
就不会报这个警告了。但还是报这个警告,为啥啊?
这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。
V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。
V2EX is a community of developers, designers and creative people.