zoukankan      html  css  js  c++  java
  • Java Factory pattern

      Factory大概是最简单的设计模式了,用了一些,也该理一理了。我们先看看它的模式模式图:

                         

       

      简单的说,工厂模式就是把“产品”与“产品生产”分离,然后对“产品”进行抽象。这样就形成了一个简单工厂模式。如果你再对“产品生产”这个环节进行抽象,那么就得到方法工厂模式。如果你在方法工厂模式里有多个产品足,那么就形成了抽象工厂。

      那就分别对以上三种举例吧:

      1.简单工厂

      

     1 //client
    2 public class SimpleFactoryTest {
    3 public static void main(String[] args) throws NoThisProduct {
    4 Product productA = SimpleFactory.createProduct(SimpleFactory.PRODUCT_A);
    5 Product productB = SimpleFactory.createProduct(SimpleFactory.PRODUCT_B);
    6 productA.work();
    7 productB.work();
    8 }
    9 }
    10 //定义抽象产品
    11 abstract class Product {
    12 public abstract void work();
    13 }
    14 //具体产品A
    15 class ProductA extends Product{
    16 @Override
    17 public void work() {
    18 System.out.println("ProductA is working !");
    19 }
    20 }
    21 //具体产品B
    22 class ProductB extends Product{
    23 @Override
    24 public void work() {
    25 System.out.println("ProductB is working !");
    26 }
    27 }
    28 //定义一个异常,当找不到该类型产品时候抛出这个异常
    29 class NoThisProduct extends Exception {
    30 public NoThisProduct(String aName) {
    31 super(aName);
    32 }
    33 }
    34 //定义工厂类
    35 class SimpleFactory{
    36 public static final int PRODUCT_A = 0;
    37 public static final int PRODUCT_B = 1;
    38 public static Product createProduct(int type) throws NoThisProduct{
    39 if(PRODUCT_A == type)
    40 return new ProductA();
    41 else if(PRODUCT_B == type)
    42 return new ProductB();
    43 else
    44 throw new NoThisProduct("it has no this type :"+type+" product ...");
    45 }
    46 }

      2.方法工厂

     1 /**
    2 * 简单工厂模式把所有的重心放到工厂类上,一旦向系统增加新的产品,就必须修改
    3 * 工厂类,不满足开闭原则(对修改关闭,对扩展开放);工厂方法模式提供一个抽象
    4 * 的工厂接口,在不同的产品结构上实现不同的产品工厂具体类来创建该层次中的产
    5 * 品,通常一个具体工厂创建一个具体产品。在新增产品的时候,只需要实现新的对
    6 * 应工厂就可以满足需要,是符合开闭原则的
    7 */
    8 //client
    9 public class MethodFactoryTest {
    10 public static void main(String[] args) {
    11 Product productA = new FactoryA().createProduct();
    12 Product productB = new FactoryB().createProduct();
    13 productA.work();
    14 productB.work();
    15 }
    16 }
    17 //定义抽象产品
    18 abstract class Product {
    19 public abstract void work();
    20 }
    21 //具体产品A
    22 class ProductA extends Product{
    23 @Override
    24 public void work() {
    25 System.out.println("ProductA is working !");
    26 }
    27 }
    28 //具体产品B
    29 class ProductB extends Product{
    30 @Override
    31 public void work() {
    32 System.out.println("ProductB is working !");
    33 }
    34 }
    35
    36 //定义工厂接口,产生产品的接口
    37 abstract class Factory{
    38 abstract Product createProduct();
    39 }
    40 //生常产品A的工厂
    41 class FactoryA extends Factory{
    42 @Override
    43 Product createProduct() {
    44 return new ProductA();
    45 }
    46 }
    47 //生常产品B的工厂
    48 class FactoryB extends Factory{
    49 @Override
    50 Product createProduct() {
    51 return new ProductB();
    52 }
    53 }

      3.抽象工厂

     1 //client
    2 public class AbstractFactoryTest {
    3
    4 public static void main(String[] args) {
    5
    6 }
    7 }
    8 //定义抽象产品A
    9 abstract class ProductA {
    10 public abstract void work();
    11 }
    12 //具体产品One
    13 class ProductAOne extends ProductA{
    14 @Override
    15 public void work() {
    16 System.out.println("ProductA is working !");
    17 }
    18 }
    19 //具体产品Two
    20 class ProductATwo extends ProductA{
    21 @Override
    22 public void work() {
    23 System.out.println("ProductB is working !");
    24 }
    25 }
    26
    27 //定义抽象产品B
    28 abstract class ProductB {
    29 public abstract void work();
    30 }
    31 //具体产品One
    32 class ProductBOne extends ProductB{
    33 @Override
    34 public void work() {
    35 System.out.println("ProductA is working !");
    36 }
    37 }
    38 //具体产品Two
    39 class ProductBTwo extends ProductB{
    40 @Override
    41 public void work() {
    42 System.out.println("ProductB is working !");
    43 }
    44 }
    45
    46 //定义工厂接口,产生产品的接口
    47 abstract class Factory{
    48 abstract ProductA createProductA();
    49 abstract ProductB createProductB();
    50 }
    51 class FactoryA extends Factory{
    52 @Override
    53 public ProductA createProductA() {
    54 return new ProductAOne();
    55 }
    56 @Override
    57 public ProductB createProductB() {
    58 return new ProductBOne();
    59 }
    60 }
    61 class FactoryB extends Factory{
    62 @Override
    63 public ProductA createProductA() {
    64 return new ProductATwo();
    65 }
    66 @Override
    67 public ProductB createProductB() {
    68 return new ProductBTwo();
    69 }
    70 }




  • 相关阅读:
    xls与csv文件的区别
    青音,经典爱情语录
    win7用户账户自动登录方法汇总
    How to using Procedure found Lead Blocker
    FTS(3) BSD 库函数手册 遍历文件夹(二)
    FTS(3) BSD 库函数手册 遍历文件夹(一)
    DisplayMetrics类 获取手机显示屏的基本信息 包括尺寸、密度、字体缩放等信息
    About App Distribution 关于应用发布
    FTS(3) 遍历文件夹实例
    OpenCV 2.1.0 with Visual Studio 2008
  • 原文地址:https://www.cnblogs.com/slider/p/2324689.html
Copyright © 2011-2022 走看看