java 设计模式 工厂模式

1.工厂方法


  • 意图

定义一个用于创建对象的接口,让子类决定实例化哪一个类。Factory Method 使一个类的实例化延迟到其子类

  • 适用性

当一个类不知道它所必须创建的对象的类的时候。 

当一个类希望由它的子类来指定它所创建的对象的时候。 

当类将创建对象的职责委托给多个帮助子类中的某一个,并且你希望将哪一个帮助子类是代理者这一信息局部化的时候

  • 工厂方法模式的构成
产品角色(Product):定义产品的接口
具体产品角色(ConcreteProduct):实现接口Product的类
工厂角色(Creator):声明工厂方法(FactoryMethod),返回一个产品

具体工厂角色(ConcreteCreator):实现FactoryMethod方法,由客户调用,返回一个产品的实例


  • 类图


  • UML序列图


首先定义一个产品接口或者抽象类,定义一个抽象工厂接口,然后不同的产品是由不同的工厂制造出来的就好像定义一个手机接口,手机有不同的品牌,如诺基亚和摩托罗拉 具体的产品,定义一个生产手机的工厂接口,然后由不同的品牌手机的工厂生产不同的手机,一个具体工厂对应一个具体的产品

手机接口:

package Factory;

public interface Mobile {
    void call();
}
摩托罗拉手机

public class Motorola implements Mobile {

    @Override
    public void call() {
        System.out.println("Motorola.call");
    }
}
诺基亚手机

package Factory;

public class Nokia implements Mobile {
    @Override
    public void call() {
        System.out.println("Nokia.call");
    }
}

工厂接口:

package Factory;

public interface MobileFactory {
    Mobile produceMobile();
}

摩托罗拉手机工厂:

package Factory;

public class MotorolaFactory implements MobileFactory {

    @Override
    public Mobile produceMobile() {
        System.out.println("MotorolaFactory.produceMobile");
        return new Motorola();
    }
}
诺基亚工厂

package Factory;

public class NokiaFactory implements MobileFactory {

    @Override
    public Mobile produceMobile() {
        System.out.println("NokiaFactory.produceMobile");
        return new Nokia();
    }
}


package Factory;

public class Client {
    public static void main(String[] args) {
        MobileFactory mobileFactory;
        Mobile mobile;
        mobileFactory  = new MotorolaFactory();
        mobile = mobileFactory.produceMobile();
        mobile.call();
        mobileFactory = new NokiaFactory();
        mobile = mobileFactory.produceMobile();
        mobile.call();
    }
}


打印结果:

MotorolaFactory.produceMobile
Motorola.call
NokiaFactory.produceMobile
Nokia.call

2.抽象工厂模式

    • 意图
提供一个创建一系列相关或相互依赖对象的接口,而无需指定它们具体的类

  • 适用性
一个系统要独立于它的产品的创建、组合和表示时。 
一个系统要由多个产品系列中的一个来配置时。 
当你要强调一系列相关的产品对象的设计以便进行联合使用时。 
当你提供一个产品类库,而只想显示它们的接口而不是实现时

  • 抽象工厂的构成
抽象工厂角色(AbstractFactory):声明生成抽象产品的方法
具体工厂角色(ConcreteFactory):执行生成抽象产品的方法,生成一个具体的产品
抽象产品(AbstractProduct):为一种产品声明接口
具体产品(ConcreteProduct):定义具体工厂生成的具体产品的对象,实现产品接口
客户角色(Client):我们的应用程序,使用抽象产品和抽象工厂生成对象

  • 类图


  • UML序列图


抽象工厂于工厂方法的区别:工厂方法每一次生产一个对象,而抽象工厂方法每次生产两个或者两个以上的对象,并且这些对象相互依赖或者相互影响的

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值