简单工厂和抽象工厂
简单工厂
简单工厂是一种可以让用户不再需要关注怎么new一个对象的具体实现,只需要用户提供一个对象的参数给工厂,工厂就可以创造一个相应的对象。
//手机工厂
public class PhoneFactory {
//简单工厂的方法是静态的,可以直接调用
public static Phone getPhone(String name) {
if(name.equalsIgnoreCase("Iphone")) {
return new Iphone();
}else {
System.out.println("找不到这个手机品牌");
return null;
}
}
}
//父类手机类
abstract class Phone {
public void getName(){
System.out.println("我的名字是手机");
}
}
//子类手机类
public class Iphone extends Phone {
@Override
public void getName() {
System.out.println("我的名字是苹果手机");
}
}
//用户端
public class Test {
public static void main(String[] args) {
Phone Iphone = PhoneFactory.getPhone("iphone");
Iphone.getName();
}
}
简单工厂的适用范围在,创造的对象较少,用户不需要了解创造对象的过程。并且简单工厂降低了耦合。有利于开发的效率。但是由于简单工厂一旦创建,就难以去增加工厂内的创建对象方法,所以简单工厂不符合开闭原则(对扩展开放,对修改关闭),其次简单工厂的静态方法无法被继承。
工厂方法
假如这时候我需要一个华为手机,但是工厂里没有,我需要增加上去,就会很麻烦。普通工厂就出现了,他做的方法就是将工厂抽象化,具体的创造工厂来继承这个抽象的工厂。我要加产品种类的时候就只需要增加一个具体的创造工厂和具体类就可以实现了。符合和开闭原则。
//父类手机类
public class Phone {
public void getName(){
System.out.println("我的名字是手机");
}
}
//子类手机类
public class HuaweiPhone extends Phone {
@Override
public void getName() {
System.out.println("我的名字是华为手机");
}
}
interface PhoneFactory{
Phone PhoneCreate();
}
public class HuaweiFactory implements PhoneFactory{
public Phone PhoneCreate(){
return new HuaweiPhone();
}
}
但是这种方法存在弊端,增加一个产品种类使系统的种类成倍增加,对于较多的种类时,代码很多很复杂。
抽象工厂
当这时用户需要再购买一个一个平板电脑的时候,我们就可以使用抽象工厂的方法。
interface Pad{
void play ();
}
class Ipad implements Pad{
public void play(){
System.out.println("Ipad打游戏");
}
}
class HuaweiPad implements Pad{
public void play(){
System.out.println("HuaweiPad打游戏");
}
}
interface Phone{
void call ();
}
class Iphone implements Phone{
public void call(){
System.out.println("苹果手机打电话");
}
}
class HuaweiPhone implements Phone{
public void call(){
System.out.println("华为手机打电话");
}
}
interface Factory{
Phone phoneCreate();
Pad padCreate();
}
class AppleFactory implements Factory{
public Phone phoneCreate(){
return new Iphone();
}
public Pad padCreate(){
return new Ipad();
}
}
public class HuaweiFactory implements Factory{
public Phone phoneCreate() {
new HuaweiPhone().call();
return new HuaweiPhone();
}
public Pad padCreate(){
return new HuaweiPad();
}
}
这样在需要电脑和手机的时候直接去找工厂就可以实现了。需要增加其它的品牌的手机和pad的时候就符合OCP原则。