zoukankan      html  css  js  c++  java
  • 简单工厂模式、工厂方法模式及抽象工厂模式

    简单工厂模式:
    描述:简单工厂模式属于类的创建型模式,又叫做静态工厂方法模式。通过专门定义一个类来负责创建其他类的实例,被创建的实例通常都具有共同的父类。
    角色职责:
    1.工厂(Creator)角色 简单工厂模式的核心,它负责实现创建所有实例的内部逻辑。工厂类可以被外界直接调用,创建所需的产品对象。
    2.抽象(Product)角色 简单工厂模式所创建的所有对象的父类,它负责描述所有实例所共有的公共接口。
    3.具体产品(Concrete Product)角色 简单工厂模式所创建的具体实例对象
    优缺点:在这个模式中,工厂类是整个模式的关键所在。它包含必要的判断
    逻辑,能够根据外界给定的信息,决定究竟应该创建哪个具体类的对象。用户在使用时可以直接根据工厂类去创建所需的实例,而无需了解这些对象是如何创建以及如何组织的。有利于整个软件体系结构的优化。不难发现,简单工厂模式的缺点也正体现在其工厂类上,由于工厂类集中了所有实例的创建逻辑,所以“高内聚”方面做的并不好。另外,当系统中的具体产品类不断增多时,可能会出现要求工厂类也要做相应的修改,扩展性并不很好。

     1 package simpleFactory;
     2 
     3 public class SimpleFactoryTest {
     4 
     5     /**
     6      * @param args
     7      */
     8     public static void main(String[] args) throws Exception{
     9         Animal dog = AnimalFactory.getAnimal("Dog");
    10         Animal cat = AnimalFactory.getAnimal("Cat");
    11         dog.eat("dog food");
    12         cat.eat("cat food");
    13     }
    14 
    15 }
    16 //抽象角色
    17 interface Animal{
    18     public void eat(String food);
    19     public void walk(String street);
    20 }
    21 //具体角色
    22 class Dog implements Animal{
    23 
    24     @Override
    25     public void eat(String food) {
    26         System.out.println("Dog is eating "+food);
    27         
    28     }
    29 
    30     @Override
    31     public void walk(String street) {
    32         System.out.println("Dog is walking in "+ street);
    33         
    34     }
    35 }
    36 //具体角色
    37 class Cat implements Animal{
    38 
    39     @Override
    40     public void eat(String food) {
    41         System.out.println("Cat is eating "+ food);
    42     }
    43 
    44     @Override
    45     public void walk(String street) {
    46         System.out.println(" Cat is waling in "+ street);
    47     }
    48 }
    49 //简单工厂
    50 class AnimalFactory {
    51     public static Animal getAnimal(String name) throws Exception{
    52         //运用反射的方式获取,影响速度,而且不能放到一个文件中
    53         //return (Animal)Class.forName(name).newInstance();
    54         if("Dog".equalsIgnoreCase(name)){
    55             return new Dog();
    56         }else if("Cat".equalsIgnoreCase(name)){
    57             return new Cat();
    58         }else{
    59             System.out.println("There is no this animal");
    60             return null;
    61         }
    62     }
    63 }

    工厂方法模式:
    描述:工厂方法模式同样属于类的创建型模式又被称为多态工厂模式 。工厂方法模式的意义是定义一个创建产品对象的工厂接口,将实际创建工作推迟到子类当中。核心工厂类不再负责产品的创建,这样核心类成为一个抽象工厂角色,仅负责具体工厂子类必须实现的接口,这样进一步抽象化的好处是使得工厂方法模式可以使系统在不修改具体工厂角色的情况下引进新的产品。
    角色职责:
    1.抽象工厂(Creator)角色 工厂方法模式的核心,任何工厂类都必须实现这个接口。
    2.具体工厂( Concrete Creator)角色 具体工厂类是抽象工厂的一个实现,负责实例化产品对象。
    3.抽象(Product)角色 工厂方法模式所创建的所有对象的父类,它负责描述所有实例所共有的公共接口。
    4.具体产品(Concrete Product)角色 工厂方法模式所创建的具体实例对象
    工厂方法模式和简单工厂模式比较
    工厂方法模式与简单工厂模式在结构上的不同不是很明显。工厂方法类的核心是一个抽象工厂类,而简单工厂模式把核心放在一个具体类上。
    工厂方法模式之所以有一个别名叫多态性工厂模式是因为具体工厂类都有共同的接口,或者有共同的抽象父类。 当系统扩展需要添加新的产品对象时,仅仅需要添加一个具体对象以及一个具体工厂对象,原有工厂对象不需要进行任何修改,也不需要修改客户端,很好的符合了“开放-封闭”原则。而简单工厂模式在添加新产品对象后不得不修改工厂方法,扩展性不好。 工厂方法模式退化后可以演变成简单工厂模式。

     1 package factoryMethod;
     2 
     3 
     4 
     5 public class FactoryMethodTest {
     6 
     7     /**
     8      * @param args
     9      */
    10     public static void main(String[] args) {
    11         AnimalFacotry ff = new CatFacotry();
    12         Animal cat = ff.getAnimal();
    13         
    14         AnimalFacotry ff2 = new DogFacotry();
    15         Animal dog = ff2.getAnimal();
    16         
    17         cat.eat("catFood");
    18         dog.eat("DogFood");
    19     }
    20 
    21 }
    22 //抽象角色
    23 interface Animal{
    24     public void eat(String food);
    25     public void walk(String street);
    26 }
    27 
    28 class Dog implements Animal{
    29 
    30     @Override
    31     public void eat(String food) {
    32         System.out.println("Dog is eating "+food);
    33         
    34     }
    35 
    36     @Override
    37     public void walk(String street) {
    38         System.out.println("Dog is walking in "+ street);
    39         
    40     }
    41 }
    42 
    43 class Cat implements Animal{
    44 
    45     @Override
    46     public void eat(String food) {
    47         System.out.println("Cat is eating "+ food);
    48     }
    49 
    50     @Override
    51     public void walk(String street) {
    52         System.out.println(" Cat is waling in "+ street);
    53     }
    54 }
    55 //抽象工厂角色
    56 interface AnimalFacotry{
    57     public Animal getAnimal();
    58 }
    59 //具体工厂角色
    60 class DogFacotry implements AnimalFacotry{
    61 
    62     @Override
    63     public Animal getAnimal() {
    64         return new Dog();
    65     }
    66     
    67 }
    68 //具体工厂角色
    69 class CatFacotry implements AnimalFacotry{
    70 
    71     @Override
    72     public Animal getAnimal() {
    73         return new Cat();
    74     }
    75     
    76 }

    抽象工厂:

    它是所有形态工厂模式中最为抽象和最具一般性的一种形态。它的用意是,使得客户端在不必指定产品的具体类型的情况下,创建多个产品簇中的产品对象。
    抽象工厂模式与工厂方法模式最大的区别就在于,工厂方法模式针对的是一个产品等级结构,而抽象工厂模式则需要面对多个产品等级结构。
     
    抽象工厂模式的角色:
    抽象工厂:工厂方法模式的核心,它与应用系统的商业逻辑无关,通常使用Java接口或抽象Java类实现
    具体工厂:直接在客户端的调用下创建产品实例
    抽象产品:是工厂方法模式所创建的对象的父类
    具体产品:抽象工厂模式所创建的任何产品对象都是某一个具体产品类的实例。
     
    什么情况下会用抽象工厂模式?
    1.一个系统不应当依赖于产品类实例如何被创建,组合和表达的细节,这对于所有形态的工厂模式都是重要的
    2.这个系统的产品有多于一个的产品族,而系统只消费其中某一族的产品(抽象工厂的原始用意)
    3.同属于同一个产品族的产品是在一起使用的,这一约束必须在系统的设计中体现出来
    4.系统提供一个产品类的库,所有产品以同样的接口出现,从而使客户端不依赖于实现。

    假如上面的例子中,如果产品,dog和cat又分了两个种类south和north,如果还使用简单工厂模式的化,会使工厂变的混乱,对扩展性不太好,如果使用抽象工厂模式,可以解决这个问题,可以参考代码如下:

      1 public class AbstractFactoryTest {
      2 
      3     /**
      4      * @param args
      5      */
      6     public static void main(String[] args) {
      7         AnimalFacotry ff = new CatFacotry();
      8         Animal ncat = ff.getNorthAnimal();
      9         Animal scat = ff.getSouthAnimal();
     10 
     11         AnimalFacotry ff2 = new DogFacotry();
     12         Animal ndog = ff2.getNorthAnimal();
     13         Animal sdog = ff2.getSouthAnimal();
     14 
     15         ncat.eat("catFood");
     16         ndog.eat("DogFood");
     17         scat.eat("catFood");
     18         sdog.eat("DogFood");
     19     }
     20 
     21 }
     22 
     23 // 抽象角色
     24 interface Animal {
     25     public void eat(String food);
     26 
     27     public void walk(String street);
     28 }
     29 //抽象角色类1
     30 interface NorthAnimal extends Animal {
     31 
     32 }
     33 //抽象角色类2
     34 interface SouthAnimal extends Animal {
     35 
     36 }
     37 
     38 class NorthDog implements NorthAnimal {
     39 
     40     @Override
     41     public void eat(String food) {
     42         System.out.println("NorthDog is eating " + food);
     43 
     44     }
     45 
     46     @Override
     47     public void walk(String street) {
     48         System.out.println("NorthDog is walking in " + street);
     49 
     50     }
     51 }
     52 
     53 class SouthDog implements SouthAnimal {
     54 
     55     @Override
     56     public void eat(String food) {
     57         System.out.println("SouthDog is eating " + food);
     58 
     59     }
     60 
     61     @Override
     62     public void walk(String street) {
     63         System.out.println("SouthDog is walking in " + street);
     64 
     65     }
     66 }
     67 
     68 class NorthCat implements NorthAnimal {
     69 
     70     @Override
     71     public void eat(String food) {
     72         System.out.println("NorthCat is eating " + food);
     73     }
     74 
     75     @Override
     76     public void walk(String street) {
     77         System.out.println(" NorthCat is waling in " + street);
     78     }
     79 }
     80 
     81 class SouthCat implements SouthAnimal {
     82 
     83     @Override
     84     public void eat(String food) {
     85         System.out.println("SouthCat is eating " + food);
     86     }
     87 
     88     @Override
     89     public void walk(String street) {
     90         System.out.println("SouthCat is waling in " + street);
     91     }
     92 }
     93 
     94 // 抽象工厂角色
     95 interface AnimalFacotry {
     96     public Animal getNorthAnimal();
     97 
     98     public Animal getSouthAnimal();
     99 }
    100 
    101 // 具体工厂角色
    102 class DogFacotry implements AnimalFacotry {
    103 
    104     @Override
    105     public Animal getNorthAnimal() {
    106 
    107         return new NorthDog();
    108     }
    109 
    110     @Override
    111     public Animal getSouthAnimal() {
    112         return new SouthDog();
    113     }
    114 
    115 }
    116 
    117 // 具体工厂角色
    118 class CatFacotry implements AnimalFacotry {
    119 
    120     @Override
    121     public Animal getNorthAnimal() {
    122 
    123         return new NorthCat();
    124     }
    125 
    126     @Override
    127     public Animal getSouthAnimal() {
    128         return new SouthCat();
    129     }
    130 
    131 }
  • 相关阅读:
    图片延时加载LazyLoad真的是LazyLoad吗?
    IO流操作实现文件拷贝\简单加密及相关知识点
    浅谈WebService开发(一)
    一次网站被挂恶意代码的查错经历
    自测,我的优点与缺点
    共鸣,此话在中国的确有些道理
    VsAddIn "Region this"
    虹影图片下载器(Preview)
    Group != Team
    同感,不转不行 低调做人,高调做事
  • 原文地址:https://www.cnblogs.com/wn398/p/3139626.html
Copyright © 2011-2022 走看看